0

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

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 呢?

4

3 回答 3

3

因为未找到分隔符,所以您将返回整个字符串。就好像字符串后面有一个不可见的分隔符。

于 2012-11-19T12:57:38.763 回答
1

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

于 2012-11-19T12:57:36.847 回答
0

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

于 2012-11-19T13:25:11.777 回答