在我的系统上,以下程序:
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?
答案 0 :(得分:3)
由于找不到分隔符,因此您将返回整个字符串。它就好像在字符串后面有一个不可见的分隔符。
答案 1 :(得分:1)
由于分隔符“。”在buf
中找到不,您对strtok
的调用成功返回指向您的第一个(也是唯一的)令牌的指针:"baaa"
。
答案 2 :(得分:0)
我想你实际上需要使用函数strstr()。 strtok_r用于分隔字符串,例如逗号或\ n。