来源:http://blog.csdn.net/guanyasu/article/details/53153705

https://zhidao.baidu.com/question/5241738.html

C语言中如何清空输入输出缓冲区

上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数,只是部分编译器自己实现的函数,是对标准C的扩展。

先来看一段代码:

 #include <stdio.h>
int main()
{
int num;
char ch ;
scanf("%d", &num);
scanf("%c", &ch);
printf("hello world\n");
system("pause");
return ;
}

设想输入一个数字和一个字母,应该出现如下情况

1

a

hello world

但事实是下面的样子

1

hello world

-----------------------------

原因是:在输入回车(‘\n’)时,相当于输入了一个字符,这样缓冲区内就残留了一个‘\n’。

再有就是我们使用scanf("%c", &ch);在中断接受一个字符,但若用户输入好几个字符,那么ch将只接受一个,而这时大量字符滞留在缓冲区内,下次再调用scanf时,还没有输入东西,缓冲区内的内容直接传到了scanf内,这样就造成了严重的错误。

下面是几种解决办法:

①解决办法一

使用setbuf(stdin,null);可以使stdin输入流由默认缓冲区转为无缓冲区,这样scanf输入完毕后,缓冲区内的东西就消失了。

 #include <stdio.h>
int main()
{
int num;
char ch ;
scanf("%d", &num);
setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区
scanf("%c", &ch);
printf("hello world\n");
system("pause");
return ;
}

②解决方法二

 #include <stdio.h>
int main()
{
int num;
char ch ;
scanf("%d", &num);
while ((c = getchar()) != EOF && c != '\n');//不停地使用getchar()获取缓冲中字符,直到获取的c是“\n”或文件结尾符EOF为止
scanf("%c", &ch);
printf("hello world\n");
system("pause");
return ;
}

使用getchar不断获取缓冲区内的内容,直到缓冲区内空为止,这种方法很有效,建议使用,C primer 上也介绍了这种方法。

注意:有很多人可能觉得使用fflush(stdin);不就能清空缓冲区了,但使用这种方法有很多不确定性。

网上查了原因:C和C++的标准里从来没有定义过 fflush(stdin)。
某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,
但是并非所有编译器都要支持这个功能(Linux 下的 gcc 就不支持),//亲测确实如此在linux的gcc下不能清空缓冲区
因为标准中根本没有定义 fflush(stdin)。

MSDN 文档里 也清楚地写着
fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。
当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。

所以大家最好不要使用fflush,移植性不好,反正上面的方法也不烦。

C语言清空输入缓冲区的更多相关文章

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

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

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

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

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

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

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

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

  5. vs2019清空输入缓冲区

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

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

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

  7. [转][修]C清空输入缓冲区

    为何要清空输入缓存区     读取时输入缓冲区中的内容会被scanf函数逐个取走,正常case下scanf()函数可以根据返回值判断成功取走的数目:但当发生读取异常之后,输入缓冲区中的内容并未被取走, ...

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

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

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

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

随机推荐

  1. ArcGIS Server 10 for java 注册SOE出现的问题

    一个SOE 需要register,但是报错 Manage Extensions Refresh Unable to register extension. com.esri.arcgis.intero ...

  2. 【转载】Qt Creator 添加自定义注释

    原文:https://blog.csdn.net/liang19890820/article/details/54925434 自定义注释注释的原则是有助于对程序的阅读理解,不宜太多,也不能太少(一般 ...

  3. 第二章 Base64与URLBase64

    2.1.算法基本规则: 加密的算法公开 加密的密钥不公开 Base64算法公开.密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作. 注意:具体的算法与密钥(对于Ba ...

  4. go语言之进阶篇有缓冲channel

    1.有缓冲channel 示例:  有缓存会阻塞,当读取完其中数值时,又可以写入. package main import ( "fmt" "time" ) f ...

  5. LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)

    题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ...

  6. 详解Vue中的nextTick

    Vue中的nextTick涉及到Vue中DOM的异步更新,感觉很有意思,特意了解了一下.其中关于nextTick的源码涉及到不少知识,很多不太理解,暂且根据自己的一些感悟介绍下nextTick. 一. ...

  7. Android -- 处理ViewPager的notifyDataSetChanged无刷新

    Viewpager在调用notifyDataSetChanged()时,界面无刷新 Viewpager在调用notifyDataSetChanged()时,界面无刷新,它确实影响我们功能的实现了.可能 ...

  8. Android -- 系统和自定义Notification

    Notification是一种让你的应用程序在不使用Activity的情况下警示用户,Notification是看不见的程序组件警示用户有需要注意的事件发生的最好途径. 作为UI部分,Notifica ...

  9. 【转】深入理解line-height

    原文: http://www.cnblogs.com/dolphinX/p/3236686.html https://www.cnblogs.com/yangjie-space/p/4858132.h ...

  10. GIT 使用cherry-pick 重演其他分支的提交

    在使用Git时是否会遇到这样的问题: 你正在使用Git进行版本控制,某天你接着昨天的工作了提交了N个提交,结果在合并远程分支的时候才发现原来你在工作之前没有注意到你要提交的分支状态 结果导致你本来要提 ...