分享一个getchar()从缓冲区拿取字符的实例。
需求:循环输入一个字符‘y’,输出yes
循环输入一个字符‘n’,输出no
其他输入,输出input again
代码如下:
#include <stdio.h>
int main()
{
char ch;
while(1)
{
printf("输入字符\n");
printf("y: 输出yes n: 输出no 其他字符:输出 input again \n");
printf("请输入...\n");
ch = getchar();
if(ch == 'y')
printf("yes\n");
else if(ch == 'n')
printf("no \n");
else
printf("input again\n");
}
return 0;
}
结果运行时:输入 y后,打印出yes,紧跟着又打印出红色区域,才能进行下次输入。
输入n也是同样的现象。当输入其他更多字符时,打印红色区域次数也随之增多。
怎么解决呢?我们多次试验,发现与输入的内容多少有关,猜测是缓冲区内容所致。
经查看getchar()函数原型,它是从缓冲区拿一个字符,而不是拿走第一字符后,会清理缓冲区剩余字符。
所以当输入y后,字符y被拿走使用,但还有个“回车”在缓冲区,程序运行时继续拿到了“回车”,因此就多输入了红色区域,其他字符同理。
知道了根源,我们就好解决了。
方法一:
加入 fflush(stdin); 系统帮我们清空缓冲区,windows系统有效,Linux系统无效。
方法二:
加入 while((ch=getchar())!=’\n’) ;
判断拿到的字符是否到“回车”了,如果不是“回车”说明缓冲区内容还有,死循环等待拿取字符;如果是“回车”了,说明缓冲区内容已取完,跳出循环,进行程序正常运行。