理解:fflush(stdin)和fflush(stdout)和rewind(stdin)
小结论(多谢网友zhao4zhong1为我解答疑难):
1、在每个最后不带\n的printf后面加fflush(stdout);(对标准输出流进行清理,但是它并不是把数据丢掉,而是及时地打印数据到屏幕上。)
2、在每个不想受到输入(接收)缓冲区旧内容影响的scanf();【或者getchar();或者gets_s();】前面加rewind(stdin);(rewind()函数的作用是把文件的当前位置指针指向文件头。)
   或者添加fflush(stdin);(fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准])
3、另外请注意检查scanf的返回值。

一、fflush(stdin);函数
     fflush(stdin)比较容易理解,即清理标准输入流,把多余的仍未被保存的数据丢掉。
比如,下面这个小程序:

  1. void main()

  2. {

  3. int a;

  4. char str[10];

  5. cin>>a;

  6. cout<<a<<endl

  7. // fflush(stdin),

  8. cin>>str;

  9. cout<<str<<endl;

  10. }

目地很简单:从stdin获得一个整数存入a,接着立马打印出来;从stdin获得一个字符串存入str,也立马打印出来。但是下面这种可能需要特别考虑:在首行输入了两个整数,在cin>>a之后,stdin缓冲还有一个整数没被读取。接下来,不等输入字符串,就直接把上面多出来的数字存入到str中去并打印。
某种程度上这是操作不规范造成的,但是程序应该要有健壮性,程序员应该提前预防这种不规范的操作。可以在程序界面上提示“请输入1个整数”,甚至有时候不厌其烦的强调和警告也必要。当然,本例为求简单,并不在UI友好方面做文章。这时,可以在cin>>str语句前插入fflush(stdin),如此一来就可以清空标准输入缓冲里多余的数据。

二、fflush(stdout);函数
小总结:
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
printf("。。。。。。。。。。。");后面加fflush(stdout);可提高打印效率
fflush(stdout)跟fflush(stdin)类似,是对标准输出流的清理,但是它并不是把数据丢掉,而是及时地打印数据到屏幕上。为了更好的理解它,需要知道一个事实:标准输出是以『行』为单位进行的,也即碰到\n才打印数据到屏幕。这就可能造成延时,如下面这几行代码:

  1. <span style="font-size:12px;">int a;

  2. printf_s("input one number:");

  3. fflush(stdout);\\#1

  4. scanf_s("%d",&a);</span>

如果没有#1那行代码,在某些平台上就可能迟迟看不到"input one number"被打印到屏幕上来,因为它没有回车。这时候,fflush(stdout)就起到及时输出的作用。
但是在Windows平台上,似乎并看不出差别来。也即MSFT已经将stdout的输出改成及时生效了。
fflush函数被广泛使用在多线程、网络编程的消息处理中。
fflush(stdout):清空输出缓冲区,并把缓冲区内容输出

三、下面一段来自360搜索“fflush”:http://baike.so.com/doc/6745731.html
C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,经我的GCC4.6.2测试),因为标准中根本没有定义 fflush(stdin)。
MSDN 文档里也清楚地写着:
fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。
以下是 C99 对 fflush 函数的定义:
int fflush(FILE *stream);
如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush函数会给那些流打上错误标记,并且返回EOF,否则返回0。

由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的。(因此,我姑且得出一个结论:我们应尽量使用rewind(stdin);来取代fflush(stdin);函数,如此结论错误,还请网友指正。)

四清空键盘缓冲区的一种好方法! http://bbs.bccn.net/thread-248420-1-1.html
用  rewind(stdin);
语句可以达到很好的清空键盘缓冲区的作用。不用考虑太多其他因素。这是我在一本名为《软件开发:编程与设计(C语言版)》中所了解到的,作者是USA的David Conger。   
以前也了解到其他的清空键盘缓冲区的方法,如:用getchar();fflush(stdin);等。但感觉很麻烦,不好用,也不容易理解。而rewind(stdin)简单好用,而且是一种可移植的方法。  
举个例子:

  1. <span style="font-size:12px;">#include <stdio.h>

  2. int main()

  3. {

  4. int i;

  5. char aString[3];

  6. printf("Please enter some characters:"); /*先向键盘缓冲区里输入无用字符*/

  7. getchar();

  8. rewind(stdin); /*清空键盘缓冲区里的无用字符*/

  9. printf("Please enter 'OK': "); /*输入字符串“OK”*/

  10. for(i=0;i<2;i++) /*字符串aString接受字符串“OK”*/

  11. {

  12. aString[i]=getchar();

  13. }

  14. aString[i]='\0';

  15. puts(aString); /*输出字符串aString*/

  16. return(0);

  17. } </span>

Microsof Visual C++下调试结果:
输入:abcdefghijk回车OK回车 
输出:OK  之前缓冲区里的abcdefghijk垃圾字符都被清空了。

下面向新手解释一下rewind(stdin);的工作原理。
C语言把键盘,显示器等设备当做文件来处理,也就是说从键盘输入相当于从一个文件中读入,向显示器输出相当于向一个文件写出。
而stdin是C标准库定义的标准文件之一,它与键盘相关联。我一般把它理解为指向键盘这个“文件”的指针。
而rewind()函数的作用是把文件的当前位置指针指向文件头。
两者结合,rewind(stdin);的作用也就是把“指向键盘(一个文件)的指针从当前位置挪到键盘(一个文件)开头”,相当于抛弃了当前键盘缓冲区中的数据,重新开始输入。 
虽然并不是真正的把缓冲区里的数据全部清掉,但却起到了清空键盘缓冲区的效果。

五、rewind(stdin)和fflush(stdin) 的有什么区别(意义,用法等等)  :http://wenda.so.com/q/1378244901061364

语法上 , 
rewind(stdin) 是把文件指针回绕到文件起始处。 
fflush(stdin) 是把文件输入缓冲区清0。 
stdin 是标准输入设备(输入流),通常是键盘。(但也可以是通过转向的文本文件。) 
------------ 
昨天有人问,数入123,第2句输入语句不能工作

  1. int a1;

  2. char s[20];

  3. scanf("%d",&a1); //第一句输入语句

  4. scanf("%[^'\n']",s); // 第2句输入语句

  5. printf("a1=%d\n s=%s\n",a1,s);

答:添上fflush(stdin); 就可以了。  
int a1; char s[20]; 
scanf("%d",&a1); //第一句输入语句 
rewind(stdin); 
// fflush(stdin); 
scanf("%[^'\n']",s); // 第2句输入语句 
printf("a1=%d\n s=%s\n",a1,s); 
添上 fflush(stdin); 效果相同。

fflush(stdin)和fflush(stdout)和rewind(stdin)的区别和作用相关推荐

  1. python中sys.stdout、sys.stdin

    如果需要更好的控制输出,而print不能满足需求,sys.stdout,sys.stdin,sys.stderr就是你需要的. 1. sys.stdout与print: 在python中调用print ...

  2. Python的sys.stdout、sys.stdin重定向

    Python的sys.stdout.sys.stdin重定向 转自:http://www.cnblogs.com/turtle-fly/p/3280519.html 本文环境:Python 2.7 使 ...

  3. java stdin 和stdout_stdin,stdout,stderr

    *标准输入输出流 #include extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; //man 1.stdin *0; // ...

  4. fflush(stdin)与fflush(stdout)

    1.fflush(stdin): 作用:清理标准输入流,把多余的未被保存的数据丢掉.. 如: int main() {int num;char str[10];cin>>num;cout& ...

  5. 清空缓冲区:fflush(stdin)、fflush(stdout)

    fflush(stdin)用来清理输入缓冲区,平时用scanf()输入数据后会按回车,一般用fflush(stdin)来清理输入缓冲区,不然有时候该回车符会影响到后面的数据输入. fflush(std ...

  6. fflush(stdin)和fflush(stdout)

    fflush(stdin)比较容易理解,即清理标准输入流,把多余的仍未被保存的数据丢掉. 比如,下面这个小程序: void main() { int a; char str[10]; cin>& ...

  7. python 中的 sys.stdin ,sys.stdout 和sys.stderr

    文档解释: File objects used by the interpreter for standard input, output and errors: stdin is used for ...

  8. Shell:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)介绍

    UNIX系统shell使用 1.文件描述符0与进程的标准输入(一般是键盘)相关联: 2.文件描述符1与标准输出(一般是显示器)相关联: 3.文件描述符2与标准出错输出(一般是显示器)相关联 1.输出 ...

  9. php fflush失败,php fflush 函数_PHP教程

    php fflush 函数 fflush ( PHP 4中" = 4.0.1 , PHP 5中) fflush -刷新输出到一个文件 描述 布尔fflush (资源$处理) 此功能部队写入所 ...

最新文章

  1. 排序算法以及其java实现
  2. 8月语言排行:C#继续呈现增长态势
  3. (九)Spring 事务开发、事务属性详解
  4. exec go 重启_无停机优雅重启 Go 程序
  5. EMD_MAINTENANCE.EXECUTE_EM_DBMS_JOB_PROCS的删除创建
  6. Unitest框架的使用(二)Unittest断言及应用
  7. 一文读懂数据平台、大数据平台、数据中台
  8. jQuery原型方法first,last,eq,slice源码分析
  9. BZOJ3456: 城市规划 多项式求逆
  10. python excel 饼图_通过python xlsxwriter模块生成EXCEL柱状图、饼图
  11. ADF单位根检验三种形式_【EViews】面板数据的处理方法及检验步骤
  12. 给定一个无重复元素的数组 candidates 和一个目标数 target .
  13. 2021平凉二中高考成绩查询,平凉二中召开2020届高考启动暨教学工作推动会
  14. pyqt5 从本地选择图片 并显示在label上
  15. 群晖日历同步到android,用群晖calander日历做华为手机、ipad、mac三方通讯录和日历同步 2020-12-28...
  16. 最新FL Studio 21中文版发布啦!全新的FL音频剪辑封套、主题和插件
  17. 代数结构入门:群、环、域、向量空间
  18. 赣州php微信群,PHP微信群加群强制分享转发裂变源码
  19. nginx php .htaccess,Linux下nginx支持.htaccess文件实现伪静态的方法
  20. 报错:The media could not be loaded, either because the server or network failed or ...

热门文章

  1. 一: 建立Vue sampleproject
  2. MySQL 学习笔记(9)— 事务控制语句、事务属性以及并发和隔离级别
  3. 面向过程和面向对象的区别(转)
  4. Integer vs int
  5. 20135234mqy 实验四
  6. GTONE清理维护建议方案
  7. 对Oracle中索引叶块分裂而引起延迟情况的测试和分析
  8. VScode配置CMAKE文件
  9. c语言定义字符类型变量的关键字,C语言数据类型
  10. java的scanner用法_Java Scanner用法详解