This question already has answers here:
Why does a space in my scanf statement make a difference? [duplicate]

(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/

10-11 23:07
查看更多