我想从字符串中获取令牌,然后获取令牌的子令牌,例如以下简短程序:
#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
这怎么发生的?谢谢。
strtok()
一次只能处理一个字符串的标记化(它依赖于内部静态变量来维护连续调用之间的状态,即不可重入和非线程安全)。要在通话strtok(bak, delim)
中f()
无效化之前调用strtok(str, delim)
的main()
,所以当执行流程将返回main()
从f()
和来调用strtok(NULL, delim)
,它实际上仍的标记化工作"a.1.2"
(这是在已完成f()
),从而token
被赋予一个空指针值,终止循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句