fflush(stdin)是一个计算机专业术语,功能是清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);。

  1.   为什么 fflush(stdin) 是错的首先请看以下程序:
    
#include <stdio.h>int main( void ){int i;for (;;) {fputs("Please input an integer: ", stdout);scanf("%d", &i);printf("%d\n", i);}return 0;}

这个程序首先会提示用户输入一个整数,然后等待用户输入,如果用户输入的是整数,程序会输出刚才输入的整数,并且再次提示用户输入一个整数,然后等待用户输入。但是一旦用户输入的不是整数(如小数或者字母),假设 scanf 函数最后一次得到的整数是 2 ,那么程序会不停地输出“Please input an integer: 2”。这是因为 scanf("%d", &i); 只能接受整数,如果用户输入了字母,则这个字母会遗留在“输入缓冲区”中。因为缓冲中有数据,故而 scanf 函数不会等待用户输入,直接就去缓冲中读取,可是缓冲中的却是字母,这个字母再次被遗留在缓冲中,如此反复,从而导致不停地输出“Please input an integer: 2”。

也许有人会说:“居然这样,那么在 scanf 函数后面加上‘fflush(stdin);’,把输入缓冲清空掉不就行了?”然而这是错的!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 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(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 operation was not input, the fflush 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. 清空输入缓冲区的方法

虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。

  #include <stdio.h>int main( void ){int i, c;for ( ; ; ){fputs("Please input an integer: ", stdout);scanf("%d", &i);if ( feof(stdin) || ferror(stdin) ){break;}while ( (c=getchar()) !='\n' && c !=EOF ) ;printf("%d\n", i);}return 0;}#include <iostream>#include <limits> // 为了使用numeric_limitsusing std::cout;using std::endl;using std::cin;using std::numeric_limits;using std::streamsize;int main(){int value;for ( ; ; ){cout << "Enter an integer: ";cin >> value;if ( cin.eof() || cin.bad() ){ // 如果用户输入文件结束标志(或文件已被读完),// 或者发生读写错误,则退出循环// do somethingbreak;}

// 读到非法字符后,输入流将处于出错状态,

// 为了继续获取输入,首先要调用 clear 函数

// 来清除输入流的错误标记,然后才能调用

// ignore 函数来清除输入流中的数据。

cin.clear();

// numeric_limits::max() 返回输入缓冲的大小。

// ignore 函数在此将把输入流中的数据清空。

// 这两个函数的具体用法请读者自行查询。

 cin.ignore( numeric_limits<streamsize>::max(), '\n' );cout << value << '\n';}return 0;}

fflush(stdin);语句的作用

#include#includevoid main(){float com=0.0,sale;int i;char grade;clrscr();printf("\n Enter sale:");scanf("%f",&sale);fflush(stdin);printf("\n Enter grade:");scanf("%c",&grade);if(sale>10000)if(grade=='A')com=sale*0.1 ;elsecom=sale*0.08 ;elsecom=sale*0.05;printf("\n Com=%f",com);}

免费领取C++资料包

C++基础知识:fflush(stdin)的误区相关推荐

  1. C/C++ 误区:fflush(stdin)

    C/C++ 误区:fflush(stdin) 注:本文转自http://blog.chinaunix.net/u/32196/showart.php?id=250809 并非原创,收入本博,聊作记录. ...

  2. Linux C 编程开发环境(工具链,编译,汇编,链接,库)基础知识与实践

    前言 本博文包括对下面书籍的学习笔记,以及实际上机编程练习,程序运行分析等的总结,作为日后工作的参考: <UNIX 环境高级编程(第三版)> <深度探索 Linux 操作系统:系统构 ...

  3. 【五】 C语言基础知识学习回顾 | 一篇搞定C语言基础 | 内附详细代码以及注释

    一 .C语言学习第一天 1.1 编写C语言代码:hello.c #include<stdio.h> #include<stdlib.h> //调用system系统函数需要包含的 ...

  4. Linux应用程序开发 基础知识

     Linux应用程序开发 本文讲述了linux应用程序开发的基本内容.值得学习! Copyright © 2006 本文遵从GNU 的自由文档许可证(Free Documentation Lice ...

  5. C语言 文件基础知识整理

    C语言文件基础知识 之前学C语言的时候老师讲文件讲的相当潦草,因为大作业的关系现在只能自己重听自学一遍.以下是根据北理工的C语言程序设计mooc的文件单元课件和上课时的补充内容所整理的C语言文件基础知 ...

  6. 第一章 软件自动化测试的基础知识

    测试工具以及测试方法并不能代表自动化测试,大多数人提到自动化测试,都会说会使用什么工具或者什么技术,这完全是错误的,和我在刚接触的时候一样,以为掌握了Selenium/QTP就以为自己是一名自动化测试 ...

  7. 《Python基础知识全家桶》

    目录 1.实现一行输入多个数字,用空格隔开 2.实现一行输入多个单词,用","隔开 3.列表 4.for循环 5.切片 6.二维列表 7.元组 8.字典 set容器 9.嵌套 字典 ...

  8. UC伯克利教授Stuart Russell人工智能基础概念与34个误区

    来源:数据简化DataSimp 数据简化DataSimp导读:UC伯克利教授StuartRussell人工智能基础概念与34个误区,Russell是加州大学伯克利分校人工智能系统中心创始人兼计算机科学 ...

  9. SEO基础知识8大精华文章之第三篇 SEO的历史(连载)

    最近看了28推赵显明的博客上关于SEO基础知识的介绍,写的很好文章,不禁特别想分享给大家看,希望大家可以喜欢,这一系列已经连载了3篇了,我会尽快连载完,让大家尽快可以看完这些精心纂写的文章.这里我特别 ...

最新文章

  1. [Freescale]E9学习笔记-LTIB安装配置
  2. oracle19c 安装权限_oracle 19c 安装
  3. Maven仓库搭建(二):GitHub、又拍云、七牛云存储
  4. python3 32位_Python 3.6.8软件安装教程
  5. RHEL 8 - 用OpenSCAP工具对容器镜像进行漏洞安全合规扫描,并修复
  6. 2012智能管道技术创新与应用实践论…
  7. JAVA编程练习50题超详细
  8. 【汉化】使用gettext和poedit对xibo-mo文件进行汉化编辑
  9. 怎么用java打开pkg文件怎么打开,pkg文件怎么打开 【处置方式】
  10. 产品读书《科技想要什么》KK
  11. Reason: Cannot pass null or empty values to constructor in spring security
  12. ORA-12569: TNS: 包校验和失败解决方法一例
  13. 深剖VR,AR和MR三者之间关系
  14. 增强 扫描王 源码_OpenCV探索之路(二十二):制作一个类“全能扫描王”的简易扫描软件...
  15. HTML5基础之常用标签以及标签选择器
  16. 从实际应用角度浅析SAP仓库中的过账变更功能
  17. Python 爬取东京奥运会奖牌榜!中国原来这么厉害!
  18. windows cmd curl 中文乱码
  19. Qt5实现飞机大战1.0(上)
  20. 树莓派系统烧录,连接电脑,电脑远程桌面控制树莓派(树莓派无屏幕,校园网)

热门文章

  1. [转载] Python Numpy基础总结
  2. Oracle 04-Oracle创建数据库
  3. js日期时间控件------layDate
  4. 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
  5. scala编程第16章学习笔记(3)——List类的高阶方法
  6. javascript div 弹出可拖动窗口
  7. opensuse 11.2/11.3安装vmware server 1.0.10笔记
  8. 浅谈C#ref和out
  9. 《The C programming language》学习笔记
  10. pcb可以给用户进程读吗_「TCP/UDP」一个端口号可以同时被两个进程绑定吗? - 一口Linux...