C

strtok_s

strtok, strtok_s

在头文件中定义
(1)
char * strtok(char * str,const char * delim);(直到C99)
char * strtok(char * restrict str,const char * restrict delim);(自C99以来)
char * strtok_s(char * restrict str,rsize_t * restrict strmax,const char * restrict delim,char ** restrict ptr);(2)(自C11以来)

1)在由str指向的以空字符结尾的字节字符串中查找下一个标记。 分隔符字符由delim指向的以空字符结尾的字节字符串标识。

该函数被设计为被称为倍数时间以从相同的字符串获得连续的令牌。

  • 如果str!= NULL,则该调用被视为针对此特定字符串的第一次调用strtok。该函数搜索不在delim中的第一个字符。

如果str或delim不是指向以空字符结尾的字节字符串的指针,则行为未定义。

2)与(1)相同,除了在每一步中,将留在str中的字符数写入* strmax并将标记器的内部状态写入* ptr。 重复调用(使用null str)必须将strmax和ptr与先前调用所存储的值一起传递。 此外,在运行时检测到以下错误,并调用当前安装的约束处理函数,而不在ptr指向的对象中存储任何内容

  • strmaxdelim或者ptr是空指针

如果两个str都指向缺少空字符的字符数组,并且strmax指向的值大于该字符数组的大小,则行为是未定义的。 作为所有边界检查函数,只有当__STDC_LIB_EXT1__由实现定义并且用户在包含string.h之前将__STDC_WANT_LIB_EXT1__定义为整数常量1时,strtok_s才能保证可用。

参数

str-指向以空字符结尾的字节字符串进行标记的指针
DELIM-指向标识分隔符的以空字符结尾的字节串的指针
strmax-指向最初保存str大小的对象的指针:strtok_s存储待检查的字符数
PTR-指向char *类型的对象的指针,strtok_s用它来存储它的内部状态

返回值

返回指向下一个标记开头的指针,如果没有其他标记,则返回NULL。

注意

这个函数具有破坏性:它在字符串str的元素中写入'\ 0'字符。 特别是,字符串文字不能用作strtok的第一个参数。

每次调用strtok都会修改一个静态变量:不是线程安全的。

与大多数其他标记器不同,strtok中的分隔符对于每个后续标记都可能不同,甚至可能取决于先前标记的内容。

strtok_s函数不同于POSIX strtok_r函数,通过防止存储在被标记化的字符串之外,并通过检查运行时约束。

#define __STDC_WANT_LIB_EXT1__ 1 #include <string.h> #include <stdio.h> int main(void) { char input[] = "A bird came down the walk"; printf("Parsing the input string '%s'\n", input char *token = strtok(input, " " while(token) { puts(token token = strtok(NULL, " " } printf("Contents of the input string now: '" for(size_t n = 0; n < sizeof input; ++n) input[n] ? printf("%c", input[n]) : printf("\\0" puts("'" #ifdef __STDC_LIB_EXT1__ char str[] = "A bird came down the walk"; rsize_t strmax = sizeof str; const char *delim = " "; char *next_token; printf("Parsing the input string '%s'\n", str token = strtok_s(str, &strmax, delim, &next_token while(token) { puts(token token = strtok_s(NULL, &strmax, delim, &next_token } printf("Contents of the input string now: '" for(size_t n = 0; n < sizeof str; ++n) str[n] ? printf("%c", str[n]) : printf("\\0" puts("'" #endif }

可能的输出:

Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0' Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'

参考

  • C11标准(ISO / IEC 9899:2011):

扩展内容

strpbrk找到一个字符串中任何字符的第一个位置,另一个字符串(函数)
strcspn返回最大初始段的长度,该最大初始段只包含在另一个字节字符串中找不到的字符(函数)
strspn返回仅由另一个字节字符串(函数)中的字符组成的最大初始段的长度
wcstokwcstok_s(C95)(C11)在宽字符串(函数)中查找下一个标记

| 用于strtok 的C ++文档|