由getchar()浅谈stdin缓冲区

相信各位使用vs的都遇到过此类状况,当使用getchar()来要使程序暂停运行的时没有达到效果,而程序似乎忽略了getchar()一般直接走完了(黑色运行窗口运行完直接消失)

对于此类函数程序前面都有使用到scanf()函数,比如下面的一个简单程序:
由getchar()浅谈stdin缓冲区_第1张图片

此时窗口并没有如想象一般停止在运行的界面下,而是直接结束了,简单来说就是此时的getchar()并没有达到system(“pause”)的效果。

通过一番激烈的资料查阅结果如下(参考资料C primer plus和互联网):


* 首先对于scanf函数,只有再按下了键盘中的回车按键之后才会去读取stdin缓冲区的数,并且是等待回车符’\r’出现后才会进入缓冲区,所以根据以上描述最终缓冲区会残留换行符在stdin缓冲区*

(tips:在windows环境下,按下回车键后会输出两个字符:回车符(‘\r’)和换行符(‘\n’),在其他操作系统环境中则不一定)

为了验证以上结论,对上面的程序做了如下的修改。

由getchar()浅谈stdin缓冲区_第2张图片

验证结果:
输入34
由getchar()浅谈stdin缓冲区_第3张图片

结果和预测结果一致,此时getchar()达到了暂停程序的效果,此状态再按下任意按键后程序结束,说明stdin缓冲区确实被清空了。

为了验证输出的c确实是换行符’\n’,笔者将输出c的语句注释掉如下所示:
由getchar()浅谈stdin缓冲区_第4张图片
运行结果如下:
输入32
由getchar()浅谈stdin缓冲区_第5张图片

和上一个实验结果进行比较如下(左边为输出字符c的),
这里写图片描述 这里写图片描述

通过观察二者光标的输出位置,发现正好相差一个换行符,由此可以证明残留在缓冲区中的确实就是’\n’。



对于上述情况,可以考虑以下三种方式来清空缓冲区(笔者在vs2013中亲测有效):

1.使用函数
fflush(stdin);//刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

2.使用
setbuf(stdin,NULL);
//将标准输入缓冲区置空NULL

3.强烈推荐

char ch;
while((ch = getchar() != ‘\n’));

将滞留在缓冲区的东西全取出来,直到为\n的情况。


希望以上内容对大家有用,欢迎指错!


你可能感兴趣的:(由getchar()浅谈stdin缓冲区)