考虑以下 C 代码片段:
#include <stdio.h>
int main()
{
int a;
char c;
scanf("%d",&a);
scanf("%c",&c);
printf("int=%d\n",a);
printf("char=%c\n",c);
}
我只能输入整数,不能输入字符。输出只是整数值,第二个 printf 语句没有输出任何值。
但是,如果我在格式说明符前使用一个空格:
scanf(" %c",&c);
它按预期工作。为什么会这样?
有人告诉我这与清除输入缓冲区有关。有人可以阐明同样的问题吗?
scanf("%c", &c1)
与scanf("%c", &c2)
的区别在于没有空格的格式读取下一个字符,即使它是空格,而带有空格的字符会跳过空格(包括换行符)并读取下一个不是空格的字符。
在 scanf()
格式中,空白、制表符或换行符表示“如果有要跳过的空白,则跳过空白”。它不会直接“清除输入缓冲区”,但它确实会吃掉任何看起来类似于清除输入缓冲区的空白(但与之截然不同)。如果你在 Windows 上,使用 fflush(stdin)
清除输入缓冲区(空白和非空白字符);在 Unix 上并根据 C 标准,fflush(stdin)
是未定义的行为。
顺便说一句,如果您键入整数后紧接着回车,程序的输出将以两个换行符结束:第一个在 c
中,第二个在格式字符串中。因此,您可能已经看到:
$ ./your_program
123
int=123
char=
$
也就是说,scanf()
读取换行符作为其输入。考虑另一种输入:
$ ./your_program
123xyz
int=123
char=x
$
整数输入在读到'x'时停止;因此,字符输入读取“x”。