strtok()不处理第二个令牌

时间:2014-03-29 02:49:50

标签: c

我想从字符串中获取令牌,然后获取令牌的子令牌,就像这个简短的程序一样:

#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

这是怎么发生的?感谢。

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()函数的递归函数。

相关问题