为何要清空输入缓存区

    读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下scanf()函数可以根据返回值判断成功取走的数目;但当发生读取异常之后,输入缓冲区中的内容并未被取走,那么下次循环之时,scanf()函数发现输入缓冲区中有内容(显然编译器不会关心这个内容是不是合法),于是不再等待user输入,直接尝试读取输入缓冲区中的内容,显而易见的又是一次读取异常,如此反复。
    为解决该问题,需要对输入缓冲区进行清空操作。
    读取异常:比如应该读取一个整形,结果输入缓冲区内当前的内容是个字符串,就会发生读取异常。

fflush(stdin)

    头文件:#include <stdio.h>
    fflush(stdin)的前世今生:由Microsoft官方提供的MSDN文档里也清楚地写着:fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充,注意啊,是Extension!)。即C 标准中根本没有定义 fflush(stdin),最新的C11直接删去了曾经打擦边球的fflush(stdin)。 
    这也就是开头说的 fflush(stdin) 曾经几乎对过一半的原因:fflush()确实也是扩展,这就是几乎对过的意思,在vs 2013之前的版本里,包括 vc++ 6.0 fflush(stdin)也确实管用。现在即使在vs 2015环境下 fflush(stdin) 也不再起作用,遑论lunix系统下呢,这就是曾经对一半。 
    当然,如果毫不在乎程序的移植性,在可用 fflush(stdin)的版本里面这么写也没什么大问题。

ffush(stdout)

如果不考虑fflush(stdin)这个坑的话,它的兄弟fflush(stdout)还是有很大的作用的,简言之,fflush(stdout)强制输出当前输出缓冲区中的内容,一些在Debug下一些莫名其妙的error可以用fflush(stdout)立即输出在处理过程中的中间结果来确定error所在。在查阅过程中发现一句话: 
    1.fflush(stdin) 对输入流的操作是未定义的,所以这个还是要慎用,或许有副作用。 
    2.fflush(stdout) 只是将需要输出的输出缓冲区中内容当即输出,利于调试且没有什么不良后果。

rewind(stdin)

    从函数名上来看,这个函数应该是重定义了输入缓冲区的Location or Size,用这个方法得到新缓冲区,前后两个输入缓冲区并不是一样的(纯猜测,轻点打脸!),其实这个函数好像也是非标准定义的(不是很确定,因为在 C11与C99的更新里面真没看到这个,不过也可以作为暂时管用的半个。都说到这里,多说一句,C11 标准确实地删除了gets()函数,用gets_s()代替,关于这一点放在最后一个链接内)

scanf(“%*[^\n]%*c”)

    原理是用扫描集将缓冲区中的字符全部读取来实现清除输入缓冲区的动作,就效果来说非常管用,而且还跨平台。 
    对scanf(“%*[^\n]%*c”)解释:%〔^\n〕将逐个读取缓冲区中的’\n’字符之前的其它字符,%后面的表示将读取的这些字符丢弃,前遇到’\n’字符时便停止读取操作,此时,缓冲区中尚有一个’\n’字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个’\n’字符,所以将’\n’连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。
 
 
 
 

[转][修]C清空输入缓冲区的更多相关文章

  1. C语言清空输入缓冲区的N种方法对比

    转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...

  2. vs2019清空输入缓冲区

    发现用cin.sync()在vs2019中不能清空输入缓冲区,以前的vs版本没试过,我看别人在vc中用cin.sync()可以清除,估计是IDE的问题..以下是我学习C++四个多月写的一整段代码 运行 ...

  3. c++中清空输入缓冲区的方法(做cf的时候炸了)

    C/C++ 四种清空输入缓冲区的方法 比较实用的一种 char c; while(c=getchar()!='\n'); 或者是这种 cin.ignore(count,c); count代表要清除的字 ...

  4. C 清空输入缓冲区,以及fflush(stdin)的使用误区和解决方法

    转载:https://blog.csdn.net/Veniversum/article/details/62048870 对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的 ...

  5. C语言清空输入缓冲区的N种方法对比【转】

    转自:http://www.cnblogs.com/codingmylife/archive/2010/04/18/1714954.html C语言中有几个基本输入函数: //获取字符系列 int f ...

  6. C语言清空输入缓冲区

    来源:http://blog.csdn.net/guanyasu/article/details/53153705 https://zhidao.baidu.com/question/5241738. ...

  7. C语言清空输入缓冲区的N种方法对比(转)

    C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 ...

  8. (转)关于fflush(stdin)清空输入缓存流(C/C++)

    来源:http://my.oschina.net/deanzhao/blog/79790 1. 为什么 fflush(stdin) 是错的?首先请看以下程序: #include <stdio.h ...

  9. scanf()中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个scanf()的时候,如果输入缓冲区还有数据的话,那么scanf()就不会询问用户输入,而是直接就将输入缓冲区的内容拿出来用了,这就导致了前面的错误影响到后面的内容,为了隔离这种 ...

随机推荐

  1. PHP之冒号、endif、endwhile、endfor 是什么鬼?f

    解释:其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法. 冒号(:)相当于是 左大括号---->{ endif.endwhile.endfor.endforeach- ...

  2. 页面加载异常 清除浏览器静态文件 js css 缓存 js动态加载js css文件,可以配置文件后辍,防止浏览器缓存

    js清除浏览器缓存的几种方法 - 兔老霸夏 - 博客园 https://www.cnblogs.com/Mr-Rocker/p/6031096.html js清除浏览器缓存的几种方法   一.CSS和 ...

  3. 部署本地gitlab

    一.gitlab简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能 ...

  4. 【react redux && flux】

    redux: http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html https://bai ...

  5. first-child与:first-of-type的区别

    css选择器中:first-child与:first-of-type的区别 :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比如有段代码: p:f ...

  6. django之自定义软删除Model

    软删除 简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录.这样做的好处是可以统计数据,可以进行恢复操作等等. 预备知识 Managers Managers 是djang ...

  7. 专项训练知识点与错题整理-nowcoder-c++

    1- 来自:http://www.cskaoyan.com/thread-595813-1-1.html 1.拷贝构造函数 转自:https://www.cnblogs.com/alantu2018/ ...

  8. genymotion——VT-x is not available (VERR_VMX_NO_VMX) 的解决方案

    进入虚拟机设置页面

  9. 学习Zookeeper需要了解的专业名词

    一.Zookeeper的集群角色 Leader:该角色是整个zookeeper集群工作机制中的核心 Follower:该角色是zookeeper集群状态的跟随者 Observer:在集群中充当观察者的 ...

  10. Delphi FastReport动态加载图片 (转载)

    以前用FastReport制作报表,从来没有打印过图片,这段时间做了个打印个人简历的程序,需要打印照片.试着在frreport模板中加载照片没 问题,可是想要动态的装载照片要怎么做呢,我的要求是将个人 ...