为什么 strtok 只打印第一个字?

Why is strtok printing only first word?

我正在使用 strtok 将 字符串 转换为 单个单词 。我做了以下事情:

int main() {
  char target[100];
  char *t;
  scanf("%s",target);
  t = strtok(target," ");
  while (t!= NULL)
  {
    printf("<<%s>>\n", t);
    t = strtok (NULL, " ");
  }
  return 0;
}

输入是字符串如'this is a string',我得到的输出是<<this>>.

变化:

scanf("%s",target);

至:

fgets(target, 100, stdin);

因为第一个在遇到您输入的空格时不会停止。

输出:

this is a string
<<this>>
<<is>>
<<a>>
<<string
>>

注意换行符 fgets() 存储如何影响输出。如果你愿意,你可以简单地丢弃它,像这样:

fgets(target, 100, stdin);
target[strlen(target) - 1] = '[=13=]';

现在输出是:

this is a string
<<this>>
<<is>>
<<a>>
<<string>>

你写的方式 scanf 它只会接受字符串直到白色 space

scanf("%s",target);

所以您需要更改从控制台获取输入的方式

scanf("%99[^\n]",target);

如果您想继续使用scanf(),那么您可以使用下面的代码片段:

#include<stdio.h>
#include <string.h>

int main() {
   char target[100];
   char *t;
   //scanf("%s",target);
   scanf("%99[0-9a-zA-Z ]", target);
   printf("%s\n",target);
   t = strtok(target," ");
   while (t!= NULL)
   {
      printf("<<%s>>\n", t);
      t = strtok (NULL, " ");
   }
   return 0;
}

工作代码here.

只需写入 scanf("%s",target); 将只读取输入直到第一个白色 space;这就是为什么你只得到第一个词作为输出。通过写入 scanf("%99[0-9a-zA-Z ]", target);,您将从输入流中读取 99 个字符(包括数字 0-9a-zA-Z 和白色 space)。

希望对您有所帮助。