scanf("%c",&c)和scanf("%c",&c)之间的差异

pas*_*r10 8 c scanf

请考虑以下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);
}
Run Code Online (Sandbox Code Playgroud)

我只能输入整数,而不能输入字符.输出只是整数值,第二个printf语句没有输出值.

但是,如果我在格式说明符之前使用空格:

scanf(" %c",&c);
Run Code Online (Sandbox Code Playgroud)

它按预期工作.为什么会这样?

有人告诉我这与清除输入缓冲区有关.有人会对此有所了解吗?

Jon*_*ler 8

scanf("%c", &c1)和之间的区别scanf(" %c", &c2)是没有空格的格式读取下一个字符,即使它是空白区域,而空白格式跳过白色空格(包括换行符)并读取下一个不是空格的字符.

scanf()格式中,空格,制表符或换行符表示"如果有要跳过则跳过空白区域".它不直接'清除输入缓冲区',但它确实占用任何类似于清除输入缓冲区的空白区域(但与此完全不同).如果你在Windows上,使用fflush(stdin)清除输入缓冲区(空格和非空格字符); 在Unix上并根据C标准,fflush(stdin)是未定义的行为.

顺便说一句,如果你输入整数后面紧跟回车符,你的程序输出结束两个换行符:第一个是in c和第二个是格式字符串.因此,您可能已经看到:

$ ./your_program
123
int=123
char=

$
Run Code Online (Sandbox Code Playgroud)

也就是说,scanf()读取换行符作为输入.考虑另一种输入:

$ ./your_program
123xyz
int=123
char=x
$
Run Code Online (Sandbox Code Playgroud)

整数输入在读取'x'时停止; 因此字符输入读取'x'.