在循环中使用带有空格的字符串上的scanf时出现的有趣行为

时间:2017-05-11 10:04:26

标签: c string scanf

我正在摆弄C并碰巧在下面编写代码。当我输入带空格的字符串时,程序接收所有输入但输出它们就好像它们在不同时间作为单个字输入一样。我认为当遇到第一个空白字符时scanf停止并忽略其余部分。但似乎并非如此。

当我在下面输入“inputWithNoSpaces”和“输入空格”时,我输入了输出。

我试着调查stdin。它接收所有输入。但我无法弄清楚scanf在做什么。我想了解发生了什么。

代码:

#include <stdio.h>

int main()
{
    int i=0;
    char word[64]="";

    while(1)
    {
        printf("enter string:");
        scanf("%s",word);
        i++;
        printf("%d:%s\n\n",i,word);
    }

    return 0;
}

输出:

enter string:inputWithNoSpaces
1:inputWithNoSpaces

enter string:input with spaces
2:input

enter string:3:with

enter string:4:spaces

enter string:

1 个答案:

答案 0 :(得分:2)

scanf()中,"%s"表示&#34;跳过空白字符,然后读取一系列非空白字符&#34;。因此,当您为其输入input with spaces时,它将在三个连续调用中返回"input""with""spaces"。这是预期的行为。有关更多信息,请阅读manual page

input with spaces
^^^^^                    First scanf("%s", s) reads this
     ^                   Second scanf("%s", s) skips over this whitespace
      ^^^^               Second scanf("%s", s) reads this
          ^              Third scanf("%s", s) skips over this whitespace
           ^^^^^^        Third scanf("%s", s) reads this