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

时间:2012-02-23 02:52:19

标签: c strtok

好的,所以我理解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"
}

3 个答案:

答案 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,就无法使用输入字符串。你没有“修复”它 - 这就是它的工作原理。