关于fflush
关于 fflush 函数的正确使用和输入缓冲区的清空方法 fflush 函数是 C 语言标准库中的一部分,用于刷新流缓冲区,使得缓冲区中的数据被写入到文件中。但是,使用 fflush 函数时需要注意一些重要的细节,以避免程序的移植性问题。 让我们看一个简单的程序,用于说明使用 fflush 函数的错误方式: ```c #include <stdio.h> int main(void) { int i; for (;;) { fputs("Please input an integer: ", stdout); scanf("%d", &i); printf("%d\n", i); } return 0; } ``` 这个程序的目的是提示用户输入一个整数,并将其输出,但是一旦用户输入的不是整数(如小数或字母),程序就会不停地输出“Please input an integer: 2”。 这是因为 scanf 函数只能接受整数,如果用户输入了字母,則这个字母将遗留在输入缓冲区中。因为缓冲区中有数据,所以 scanf 函数不会等待用户输入,而是直接从缓冲区中读取数据。 有人可能会说:“那么,在 scanf 函数后面加上 fflush(stdin) 不就行了?”然而,这是错误的!C 和 C++ 的标准中从来没有定义过 fflush(stdin)。虽然某些编译器(如 VC6)支持使用 fflush(stdin) 来清空输入缓冲,但并不是所有编译器都支持这个功能(gcc3.2 不支持),因为标准中根本没有定义 fflush(stdin)。 MSDN 文档中也清楚地写着 fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。 那么,如何正确地清空输入缓冲区呢?答案是,我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。 ```c #include <stdio.h> int main(void) { int i, c; for (;;) { fputs("Please input an integer: ", stdout); if (scanf("%d", &i) != EOF) { while ((c = getchar()) != '\n' && c != EOF) { ; } } printf("%d\n", i); } return 0; } ``` 这段代码使用了 getchar 函数来清空输入缓冲区中的残留字符。while 循环将继续读取输入缓冲区中的字符,直到遇到换行符('\n')或 EOF。这样,我们可以确保输入缓冲区中的所有残留字符被清空,从而避免了使用 fflush(stdin) 带来的移植性问题。
- 粉丝: 12
- 资源: 84
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 10-【附件】-10-续签劳动合同补充协议书.docx
- 10-【附件】-14-劳动合同到期人员续签审批表.xlsx
- 10-【附件】-11-续订劳动合同意向通知书及回执.docx
- 10-【附件】-07-终止劳动合同通知书.docx
- 10-【附件】-12-劳动合同终止办理情况登记表.docx
- 10-【附件】-08-终止劳动合同证明书.docx
- 10-【附件】-13-劳动合同签收备案表.xlsx
- 11-【员工手册】-06-公司员工手册.docx
- 四旋翼无人机PID控制的MATLAB仿真.zip
- 四足机器人线性MPC控制平台Webots MATLAB.zip
- 睡眠波分析是一个开源的matlab工具箱,用于对睡眠脑电图数据中的各种波形进行评分和分析.zip
- 随机森林的MATLAB实现支持任意弱学习者,你可以定义.zip
- 它包含与我的机器学习笔记相关的所有MATLAB演示代码.zip
- 孙宏福QSM重构管道的MATLAB代码.zip
- 它是用MATLAB开发的用于建筑或暖通空调系统能源系统建模的小型软件.zip
- 提供的函数将您从实时脚本生成的latex转换为markdown,以便它可以轻松地生成带有MATLAB代码方程和图形的R.zip