好的,所以我理解strtok会修改它的输入参数,但在这种情况下,它会将输入字符串折叠成只有第一个标记。为什么会发生这种情况,我该怎么做才能解决这个问题? (请注意,我不是在谈论变量“temp”,其中应该是第一个令牌,而是变量“input”,在一次调用strtok后变为“this”)< / p>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
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"
}
答案 0 :(得分:29)
当strtok()
找到一个令牌时,它会在令牌后立即将字符更改为\0
,然后返回指向令牌的指针。下次使用NULL
参数调用它时,它会开始查看终止第一个标记的分隔符 - 即\0
之后,可能还会继续。
现在,指向字符串开头的原始指针仍然指向字符串的开头,但第一个标记现在是\0
- 终止 - 即,printf()
认为结束了token是字符串的结尾。其余数据仍然存在,但\0
阻止printf()
显示该数据。如果您使用for
循环遍历原始输入字符串直到原始字符数,您会发现数据仍然存在。
答案 1 :(得分:4)
您应该打印出从strtok
收到的令牌而不用担心输入数组,因为strtok
会插入NULL。您需要重复调用才能获得所有令牌:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
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, " ");
}
}
答案 2 :(得分:2)
这是因为strtok在每个分隔符中插入了空值,这就是为什么你使用strtok重复调用来获取每个标记的原因。一旦开始使用strtok,就无法使用输入字符串。你没有“修复”它 - 这就是它的工作原理。