strtok
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指向的对象中存储任何内容
strmax
,delim
或者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 ++文档|