考虑下面的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);
}我只能输入整数,而不能输入。character.The的输出仅仅是整数值,第二个printf语句没有输出值。
但是,如果我在格式说明符之前使用空格:
scanf(" %c",&c);它的工作方式与预期一致。为什么会这样呢?
有人告诉我这与清除输入缓冲区有关。有没有人能解释一下这件事?
发布于 2013-08-28 22:56:56
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‘。
发布于 2013-08-28 22:57:46
因为在您输入数字并按ENTER键之后,新行将保留在缓冲区中,并将由第二个scanf处理。
简而言之,您在变量c中保存了新行。
但是,如果您使用
scanf(" %c",&c);
// ^空格将占用新行,这将使c成为您所期望的值。
发布于 2013-08-28 22:59:49
您必须传递一个指向格式字符串指定的数据对象的指针,因此
scanf("%c", c);将实际传递c的值,这反过来可能导致程序错误,
scanf("%c", &c);将传递c的地址,允许scanf更改副本的值。
%c后面的空格将强制它先查找字符,然后再查找空格。如果没有空格,它将不会读取字符
https://stackoverflow.com/questions/18491390
复制相似问题