扫描格式字符串中"%c"后的空格忽略最后一个字符


#include <stdio.h>
int main(void)
{
char c;
while (scanf(" %c ", &c) != EOF)
printf("you typed: %c n", c);
return 0;
}

我可以像" %c"一样在%c之前放置空格,scanf读取单个字符并跳过任何空格,但是如果我在%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"未读,对吧?

顺便说一句,在" %c"的情况下,没有预期的问题。

从C11标准的草案:

7.21.6.2fscanf函数

[...]

5. 由空格字符组成的指令通过读取输入直到第一个非空格字符(保持未读取状态(来执行,或者直到无法读取更多字符。该指令永远不会失败。

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

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

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