您的位置:首页 > 编程语言 > C语言/C++

由getchar()浅谈stdin缓冲区

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

对于此类函数程序前面都有使用到scanf()函数,比如下面的一个简单程序:



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

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

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

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

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



验证结果:

输入34



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

为了验证输出的c确实是换行符’\n’,笔者将输出c的语句注释掉如下所示:



运行结果如下:

输入32



和上一个实验结果进行比较如下(左边为输出字符c的),





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

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


1.使用函数

fflush(stdin);
//刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

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

3.强烈推荐

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


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

希望以上内容对大家有用,欢迎指错!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息