由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’。
1.使用函数
2.使用
3.强烈推荐
将滞留在缓冲区的东西全取出来,直到为\n的情况。
希望以上内容对大家有用,欢迎指错!
对于此类函数程序前面都有使用到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的情况。
希望以上内容对大家有用,欢迎指错!
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- SQL Server 数据页缓冲区的内存瓶颈分析
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构