#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.2
fscanf
函数[...]
5. 由空格字符组成的指令通过读取输入直到第一个非空格字符(保持未读取状态(来执行,或者直到无法读取更多字符。该指令永远不会失败。
这意味着*scanf
格式字符串中的空格字符将读取并丢弃所有空格字符,直到遇到非空格字符。
因此,即使您输入"a s d f "
,您的scanf
在消耗f
后,也会读取并丢弃最后一个空格,并等待进一步的输入,因为它还没有遇到非空格字符。
您可以通过发送EOF
信号来关闭流,以便scanf
停止扫描并返回EOF
。或者,您可以删除该空间并将其还原为最初拥有的" %c"
。