为什么strtok会改变这样的输入?

好的,所以我理解strtok会修改它的输入参数,但在这种情况下,它会将输入字符串折叠成只有第一个标记。 为什么会发生这种情况,我该怎么做才能解决这个问题? (请注意,我不是在讨论变量“temp”,它应该是第一个标记,而是变量“input”,在一次调用strtok后变为“this”)

#include  #include  #include  int main(int argc, char* argv[]) { char input[]="this is a test of the tokenizor seven"; char * temp; temp=strtok(input," "); printf("input: %s\n", input); //input is now just "this" } 

strtok()找到一个标记时,它会在标记后立即将字符更改为\0 ,然后返回指向标记的指针。 下次使用NULL参数调用它时,它会开始查看终止第一个标记的分隔符 – 即在\0 ,可能还会继续。

现在,指向字符串开头的原始指针仍然指向字符串的开头,但第一个标记现在是\0 -terminated – 即, printf()认为标记的结尾是字符串的结尾。 剩下的数据仍然存在,但是\0阻止printf()显示它。 如果你使用for -loop遍历原始输入字符串直到原始字符数,你会发现数据仍然存在。

您应该打印出从strtok收到的令牌而不用担心输入数组,因为strtok会插入NULL。 您需要重复调​​用才能获得所有令牌:

 #include  #include  #include  int main(int argc, char* argv[]) { char input[]="this is a test of the tokenizor seven"; char * temp; temp=strtok(input," "); while( temp != NULL ) { printf("temp is \"%s\"\n", temp ); temp = strtok( NULL, " "); } } 

这是因为strtok将空值插入到每个分隔符中,这就是为什么你使用strtok重复调用来获取每个标记的原因。 一旦开始使用strtok,就无法使用输入字符串。 你没有“修复”它 – 它是如何工作的。