c语言清空scanf缓存,C语言清空输入缓冲区

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

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

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

c语言清空scanf缓存,C语言清空输入缓冲区_第1张图片

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

先来看一段代码:

#include

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

int main()

{

int num;

char ch ;

scanf("%d", &num);

setbuf(stdin, NULL);//使stdin输入流由默认缓冲区转为无缓冲区

scanf("%c", &ch);

printf("hello world\n");

system("pause");

return ;

}

②解决方法二

#include

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语言清空输入缓冲区的N种方法对比

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

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

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

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

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

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

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

vs2019清空输入缓冲区

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

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

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

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

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

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

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

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

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

随机推荐

SQL Injection bypass WAF

tips: 利用的注射点: 支持Union 可报错 支持多行执行.可执行系统命令.可HTTP Request等额外有利条件 若非以上类型,则可能需要暴力猜解.猜解时,可能会遇到一些限制.攻击者要做的, ...

Parallel 试验

using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Di ...

Elasticsearch——多索引的使用

在Elasticsearch中,一般的查询都支持多索引. 只有文档API或者别名等不支持多索引操作,因此本篇就翻译一下多索引相关的内容. 首先,先插入几条数据: $ curl -XPOST local ...

python学习笔记-(七)python基础--集合、文件操作&;函数

本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

Python编程规范

打破一条既定规则的两个理由: 应用这个规则将导致代码可读性下降. 为了和周围的代码保持一致. 编码: 所有的 Python 脚本文件都应在文件头标上如下标识或其兼容格式的标识: # -*- codin ...

cocos2dx lua 加密

cocos2dx-lua项目发布时,为了保护lua源码,需要对lua进行加密.通常分为两种方式:加密文件和编译为字节码. 1.加密文件 前提是你不用luajit,而使用lua.这样这种方法是真正加密, ...

git 介绍及其使用总结

版本控制 Git                   目录  目录 2 第1章 Shell和vi 4 1.1 什么是shell 4 1.2 shell分类 4 1.3 认识bash这个shell ...

一文入门HTML5

1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...

tensorflow 1.0 学习:参数和特征的提取

在tf中,参与训练的参数可用 tf.trainable_variables()提取出来,如: #取出所有参与训练的参数 params=tf.trainable_variables() print(&q ...

你可能感兴趣的:(c语言清空scanf缓存)