This question already has answers here:
Why does a space in my scanf statement make a difference? [duplicate]
(3个答案)
7年前关闭。
考虑以下C代码片段:
我只能输入整数而不是字符。输出只是整数值,第二个printf语句不输出任何值。
但是,如果我在格式说明符之前使用空格:
它按预期工作。为什么会这样呢?
有人告诉我,这与清除输入缓冲区有关。有人可以阐明相同的观点吗?
也就是说,
整数输入在读取“x”时停止;因此,字符输入将读取“x”。
(3个答案)
7年前关闭。
考虑以下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”。
关于c - scanf ("%c"和&c)之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18491390/