"%c"之后的空白区域在scanf格式字符串中忽略最后一个字符

时间:2017-07-09 16:51:06

标签: c scanf

#include <stdio.h>

int main(void)
{
    char c;
    while (scanf(" %c ", &c) != EOF)
        printf("you typed: %c \n", c);

    return 0;
}

我可以在%c " %c"之前添加空格,让scanf读取单个字符并跳过任何空格,但如果我在{{1}之后放置另一个空格有问题:

%c

那为什么它会在输入流中留下最后一个字符?即使我实际上用尾随空格键入a s d f you typed: a you typed: s you typed: d 1 2 3 you typed: f you typed: 1 you typed: 2

事实上"a s d f "scanf未读,对吧?

顺便说一下"f \n"的情况没有问题。

1 个答案:

答案 0 :(得分:4)

来自draft of the C11 standard

  

7.21.6.2 The fscanf function

     

[...]

     

5.由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败。

这意味着格式字符串*scanf中的空格字符将读取并丢弃所有空格字符,直到遇到非空白字符

因此,即使您输入"a s d f ",您的scanf在使用f后会读取并丢弃最终空格会等待进一步输入,因为它还没有遇到非空白字符。

您可以通过发送EOF信号来关闭信息流,以便scanf停止扫描并返回EOF。或者您可以删除该空格并将其还原为原来的" %c"