下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C和C+清空输入流及小技巧C/C+清空输入流的小技巧1. 为什么fflush(stdin)是错的首先请看以下程序:# include <stdio.h>int main( void)int i;for (;) fputsf'Please input an integer: ", stdout);scantr%df, &i);printf(M%dnM, i);return 0;这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出 刚才输入的整数,并且再次提示用户输入一个整数,然后锌待用户输入但是一旦用户输入的不是整数(如 小
2、数或者字母),假设scant函数最后一次得到的整数是2 ,那么程序会不停地输出"Please input an integer: 2这是因为scanf(M%dM, &i);只能接受整数,如果用户输入了字母,则这个字母会遗留在"输 入缓冲区”中因为缓冲中有数据,故而scant函数不会等待用户输入,直接就去缓冲中读取,可是缓冲 中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出"Please input an integer:也许有人会说:“居然这样,那么在scant函数后面加上Mush(stdin);,,把输入缓冲清空掉 不就行了? ”然
3、而这是错的! C和C+的标准里从来没有定义过fflush(stdin).也许有人会说:“可是我用 fflush(stdin)解决了这个问题,你怎么能说是错的呢? ”的确,某些编译器(如VC6)支持用fflush(stdin) 来清空输入缓冲,但是并非所有編译器都要支持这个功能(linux下的gcc就不支持),因为标准中根 本没有定义 fflush(stdin)> MSDN 文档里也清楚地写着 fflush on input stream is an extension to the c standard (fflush操作输入流是对C标准的扩充)。当然,如果你亳不在乎程序的移植性,用 f
4、flush(stdin)也没什么大问题.以下是C99对fflush函数的定义:int fflush(FILE 'stream);如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把这个流中任何待写数据传送至宿主环境(host environment写入文件。否则,它的行为是未定义的。原文如下:int fflush(FILE *stream);If stream points to an output stream or an update stream in whichthe most recent oper
5、ation was not input, the (flush function causesany unwritten data for that stream to be delivered to the host environmentto be written to the file; otherwise, the behavior is undefined其中,宿主环境可以理解为操作系统或内核等。由此可知,如果stream捋向输入流(如stdin),那么fflush函数的行为是不确定的。故而 使用fflush(stdin)是不正确的,至少是移植性不好的.2.清空输入缓冲区的方法虽然不
6、可以用fflush(stdin),但是我们可以自己写代码来消空输入缓冲区。只需要在scant函数 后面加上几句简单的代码就可以了。广C版本#include <stdio.h>int main( void)int i, c;for (;)fputsf'Please input an integer:,f, stdout);scanf(,%dM, &i);if (feof(stdin) | ferror(stdin)广如果用户输入文件结束标志(或文件已被读完),*/r或者发生读写错误,则退出循环/* do something */break;广没有发生错误,淸空输入流.
7、*/r通过while循环把输入流中的余留数据“吃”掉*/while (c = getcharO) !=&& c != EOF);/*使用scanf(“5“);也可以淸空输入流” Tprintf(M%dnM, i);return 0;广C+版本*/#include <iostream>#include <limits> / 为了使用 numericjimitsusing std:cout;using std:endl;using std:cin;using std:numericjimits;using std:streamsize;int main()i
8、nt value;for (;)cout« "Enter an integer:H;cin » value;if (cin.eofO II cin.bad()/如果用户输入文件结束标志(或文件已被读完),/或者发生读写错误,则退出循环/ do somethingbreak;H读到非法字符后,输入流将处于出错状态,/为了继续获取输入,廿先要调用clear函数来清除输入流的错误标记,然后才能调用/ ignore函数来清除输入流中的数据。cin.clearQ;/ numericjimits<streamsize>:max()返回输入缓冲的大小。/ ignore函数在此将把
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度电子商务平台合作订单合同4篇
- 专业安装劳务协议规范文本2024版
- 《a临时起搏器》课件
- 二零二五年度矿业权转让中的水资源利用合同3篇
- 2024版园林绿化工程设计与施工合同3篇
- 2025年度智慧能源场标准化改造项目合同协议书4篇
- 2024科研机构与制药公司之间的药物研发合同
- 2024石子加工与新型建材研发生产合同3篇
- 2025年度厂房出租合同附带租赁双方权利义务界定4篇
- 2025年度茶楼消防安全管理责任合同4篇
- 2024年安徽省公务员录用考试《行测》真题及答案解析
- 山西省太原市重点中学2025届物理高一第一学期期末统考试题含解析
- 充电桩项目运营方案
- 2024年农民职业农业素质技能考试题库(附含答案)
- 高考对联题(对联知识、高考真题及答案、对应练习题)
- 新版《铁道概论》考试复习试题库(含答案)
- 【律师承办案件费用清单】(计时收费)模板
- 高中物理竞赛真题分类汇编 4 光学 (学生版+解析版50题)
- Unit1FestivalsandCelebrations词汇清单高中英语人教版
- 2024年上海市中考语文试题卷(含答案)
- 幼儿园美术教育研究策略国内外
评论
0/150
提交评论