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

时间:2016-07-30 06:06:58

标签: c string split scanf strtok

我正在使用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;
}

输入是一个字符串,例如&#39;这是一个字符串&#39;,我得到的输出是<<this>>

3 个答案:

答案 0 :(得分:6)

您编写scanf的方式只接受字符串直到空格

  

的scanf(&#34;%S&#34;,目标);

所以你需要改变从控制台输入输入的方式

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

答案 1 :(得分:3)

更改:

   <script type="text/javascript">
     var dt = new Date('2016/12/10');
     var month = dt.getMonth()+1;
     var day = dt.getDate()-1;
     var year = dt.getFullYear()+1;
     alert(month + '-' + day + '-' + year);
   </script>

为:

scanf("%s",target);

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

输出:

fgets(target, 100, stdin);

注意新行fgets()存储如何影响输出。如果你愿意,你可以简单地丢弃它,如下所示:

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

现在的输出是:

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

答案 2 :(得分:3)

如果您想继续使用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);只会读取输入,直到第一个空格;这就是为什么你只得到第一个单词作为输出。通过撰写scanf("%99[0-9a-zA-Z ]", target);,您可以从输入流中读取99个字符(包括数字0-9a-zA-Z和空格)。

希望这有用。