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

请考虑以下C代码段:

#include  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’。

因为在输入数字并按ENTER后,新行将保留在缓冲区中,并由第二个scanf

简而言之,您在变量c保存了新行。

但是,如果你使用

 scanf(" %c",&c); // ^ 

空间将消耗新线,这使c成为您期望的值。

您必须将指针传递给格式字符串指定的数据对象,因此

 scanf("%c", c); 

实际上会传递c的值,这反过来可能导致程序错误,

 scanf("%c", &c); 

将传递c的地址,允许scanf更改副本的值。

%c之后的空格将强制它寻找一个角色,然后是一个空格。 如果没有空格,则不会读取该字符