我想从字符串中获取令牌,然后获取令牌的子令牌,就像这个简短的程序一样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void f(char *bak)
{
char *token, *delim = ".";
token = strtok(bak, delim);
while(token) {
printf("f(): token: %s\n", token);
token = strtok(NULL, delim);
}
}
int main(void)
{
char str[] = "a.1.2 x.y";
char *token, *delim = " \t\n\r";
token = strtok(str, delim);
while(token) {
printf("main: token: %s\n", token);
char bak[100];
strncpy(bak, token, sizeof(bak));
f(bak);
token = strtok(NULL, delim);
}
return 0;
}
但是,它只显示第一个标记(“a.1.2”),而不是第二个标记:
main: token: a.1.2
f(): token: a
f(): token: 1
f(): token: 2
这是怎么发生的?感谢。
答案 0 :(得分:4)
strtok()
一次只能处理一个字符串的标记化(它依赖于内部静态变量来维持连续调用之间的状态,非重入和非线程安全)。 strtok(bak, delim)
中对f()
的调用使以前对strtok(str, delim)
中main()
的调用无效,因此当执行流程从main()
返回f()
时并且来到strtok(NULL, delim)
的来电,它实际上仍在处理"a.1.2"
的标记化(已在f()
中完成),因此token
已分配带有空指针值,终止循环。
答案 1 :(得分:0)
strtok()一次处理一个字符串的一个标记。因此,您可以使用strtok_r()函数一次处理一个字符串的多个令牌。
SO,它是strtok()函数的递归函数。