一,问题场景
使用getchar获取用户输入,根据用户输入判断是否退出循环,输入字符之后,发现连续出现两次提示输入
int main( int argc, char **argv )
{
char condition;
do
{
printf("input y or Y to quit\n");
condition = getchar();
}while( condition != 'y' || condition != 'Y' );
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/ff7516f2d494fb6b047de44b0bd853ae.png)
二,原因分析
在标准输入stdin中,输入q\n之后,两个字符会进入输入缓冲区,通过getchar从输入缓冲区获取一个字符q,由于缓冲区还存在\n字符,所以getchar直接返回。\n不满足循环退出。所以再次输入提示信息。
三,解决办法
int fflush(FILE *stream);//fflush会强制将缓冲区中的数据写会stream描述符中
1)fflush(stdin):
在getchar之后调用fflush(stdin),可以将缓冲区中的数据清空。
2)fflush(stdout)
会强制刷新输出缓冲区中的数据到标准输出
四,输入输出缓存缓冲(参考:https://blog.csdn.net/Infect_your_breath/article/details/75944176)
缓存类型:
全缓存:当填满I/O缓存后才进行实际I/O操作(或者执行fflush、flose、exit、return),4K大小
行缓存:当填满I/O缓存后才进行实际I/O操作或者遇到‘\n’(或者执行fflush、floce、exit、return),1K大小
无缓存:标准错误输出strerr
printf(),是先将格式化好的信息先输到缓冲区上,因为输入输出的缓存为行缓存,所以当填满I/O缓存后,才进行实 际 I/O操作或者遇到换行符‘\n’(或者执行fflush、floce、exit、return),缓存大小为1K。
scanf()这个函数在缓存里面读数据时,会先将缓存区刷新,还有getc()、gets()、fgetc()、fgets()这几个读取数据时,也会会先将缓存区刷新,然后再读取数据。。