为什么strtok_r总能找到“。”模式?

时间:2012-11-19 12:50:17

标签: c strtok

在我的系统上,以下程序:

int main(){
        char *strgptr;
        char buf[5] = {'b','a','a','a','\0'};
        char *tmp = strtok_r(buf, ".", &strgptr);
        if(tmp != NULL){
                printf("Found a . in baaa?\n");
                printf("It was found starting at: %s\n", tmp);
        }
        else
                printf("Everything is working.\n");
}

打印:

Found a . in baaa?
It was found starting at: baaa

但是,如果我换掉“。”在strtok_r中为“a”分隔字符串,我得到(正如预期的那样):

Found a . in baaa?
It was found starting at: b

但交换“。”对于没有出现在buf中的任何其他字符(例如“c”)产生:

Found a . in baaa?
It was found starting at: baaa

正如预期的那样,strtok_r的手册页说:

The strtok() and strtok_r() functions return a pointer to the next token, 
or NULL if there are no more tokens.

那么为什么strtok_r在传递一个不包含任何相关标记的字符串时无法返回NULL?

3 个答案:

答案 0 :(得分:3)

由于找不到分隔符,因此您将返回整个字符串。它就好像在字符串后面有一个不可见的分隔符。

答案 1 :(得分:1)

由于分隔符“。”在buf中找到,您对strtok的调用成功返回指向您的第一个(也是唯一的)令牌的指针:"baaa"

答案 2 :(得分:0)

我想你实际上需要使用函数strstr()。 strtok_r用于分隔字符串,例如逗号或\ n。