c语言中fflush(stdin)的作用

c语言中fflush(stdin)的作用

ID:8970561

大小:26.50 KB

页数:5页

时间:2018-04-13

c语言中fflush(stdin)的作用_第1页
c语言中fflush(stdin)的作用_第2页
c语言中fflush(stdin)的作用_第3页
c语言中fflush(stdin)的作用_第4页
c语言中fflush(stdin)的作用_第5页
资源描述:

《c语言中fflush(stdin)的作用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、C/C++误区二:fflush(stdin)来源:蚂蚁的C/C++标准编程作者:antigloss等级:精品发布于2005-10-2213:56被读9885次【字体:大中小】今天看程序时,遇到了fflush()这个函数,以前从没有接触过,google了一下,发现这个篇文章介绍的很详细,贴上来和大家共享一下。Antigloss最后修改于2006-11-25 1.      为什么fflush(stdin)是错的 首先请看以下程序:                  #include

2、 intmain(void){   inti;   for(;;){       fputs("Pleaseinputaninteger:",stdout);       scanf("%d",&i);       printf("%d",i);   }   return0;} 这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设scanf函数最后

3、一次得到的整数是2,那么程序会不停地输出“Pleaseinputaninteger:2”。这是因为scanf("%d",&i);只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而scanf函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Pleaseinputaninteger:2”。 也许有人会说:“居然这样,那么在scanf函数后面加上‘fflush(stdin);’,把输入缓冲清

4、空掉不就行了?”然而这是错的!C和C++的标准里从来没有定义过fflush(stdin)。也许有人会说:“可是我用fflush(stdin)解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用fflush(stdin)来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持),因为标准中根本没有定义fflush(stdin)。MSDN文档里也清楚地写着fflushoninputstreamisanextensiontotheCstandard(fflus

5、h操作输入流是对C标准的扩充)。当然,如果你毫不在乎程序的移植性,用fflush(stdin)也没什么大问题。以下是C99对fflush函数的定义: intfflush(FILE*stream); 如果stream指向输出流或者更新流(updatestream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把这个流中任何待写数据传送至宿主环境(hostenvironment)写入文件。否则,它的行为是未定义的。原文如下:intfflush(FILE*stream);Ifstream

6、pointstoanoutputstreamoranupdatestreaminwhichthemostrecentoperationwasnotinput,thefflushfunctioncausesanyunwrittendataforthatstreamtobedeliveredtothehostenvironmenttobewrittentothefile;otherwise,thebehaviorisundefined. 其中,宿主环境可以理解为操作系统或内核等。    由此可知,如果

7、stream指向输入流(如stdin),那么fflush函数的行为是不确定的。故而使用fflush(stdin) 是不正确的,至少是移植性不好的。  2.      清空输入缓冲区的方法  虽然不可以用fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在scanf函数后面加上几句简单的代码就可以了。       /*C版本*/       #include        intmain(void)       {           inti,c;    

8、         for(;;)           {              fputs("Pleaseinputaninteger:",stdout);               scanf("%d",&i);             if(feof(stdin)

9、

10、ferror(stdin))               {/*如果用户输入文件结束标志(或文件已被读完),*/                /*或者发生读写错误,则退出循环              */

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。