问题来源
int main() {
int i;
char c;
scanf("%d",&i);
printf("i=%d\n",i);//把标准缓冲区中的整型数读走了
scanf("%c",&c);
printf("c=%c\n",c);//输出字符变量c
return 0;
}
输入10,回车后,程序并没有停下来让你继续输入字符,而是输出
i=10
c=
//运行结束
就完了,注意c=下面有一行空的。
这是因为scanf让程序暂停让你输入的原理是判断标准输入缓冲区是否为空,如果是空的就暂停程序,如果不是空的就按照格式(%d,%c这种格式)读走缓冲区的内容。而整型、浮点型、字符串型的读取是会忽略换行符\n、空格等一些字符,直接找后面的内容的,字符型却会把这些也读走,不会忽略。
以上面代码为例,一开始标准输入缓冲区里没有东西,所以暂停程序让我们输入内容,这时候我们输入10,回车,缓冲区里出现10\n,然后%d把10读走,只剩下\n,然后到scanf("%c",&c);
的时候,发现缓冲区里还有\n,所以直接读走,所以c=下面出现了一空行。
解决办法为在scanf("%c",&c);
前面加一行fflush(stdin);
表示清空缓冲区里的内容,问题就解决了
在连续输入的情况下也会出现类似情况,比如scanf("%d%c%f",&d,&c,&f);输入10空格的时候%c就把空格读走了,这时候程序会警告这个语句只读到两个数据,解决办法是在%c前面加一个空格。
Comments NOTHING