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

use*_*326 16 c strtok

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

#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"
}
Run Code Online (Sandbox Code Playgroud)

Ern*_*ill 30

strtok()发现一个道理,它的令牌到后,立即改变了性格\0,然后返回一个指向该标记.下次你用一个NULL参数调用它时,它会开始寻找终止第一个标记的分隔符 - 也就是说,在它之后\0,可能还有一些.

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

  • 我懂了。我对 strtok 工作原理的理解还很遥远——我认为它会砍掉标记,然后将输入指针滑动到分隔符之后的第一个字符。无论如何,谢谢你!这是一个非常明确且有帮助的答案。 (3认同)
  • @CătălinaSîrbu 如果您需要保留字符缓冲区的原始内容,那么是的,您需要制作一个副本。但实际上这种情况很少发生。 (2认同)

Hun*_*len 5

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

#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, " ");
  }
}
Run Code Online (Sandbox Code Playgroud)