为什么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,就无法使用输入字符串。 你没有“修复”它 – 它是如何工作的。