-
2021-11-16 15:47:13
今天写到scanf突然发现缓冲区输入不定时,对于清除缓冲区很麻烦,
而去网上查了几种效果也不是很理想,自己综合网上的方法写了一个
如果单独使用getchar()函数一次只能清除一个,但是对于输入不定的情况而言虽然能用但是不是很理想,所以要和循环配套使用,而循环的使用需要结束条件,此时条件为
getchar()!='\n'
即可,故,整体为
float a=0; for(;;) { printf("Enter :"); scanf("%f",&a); if(getchar()!='\n') { while(getchar()!='\n') continue; printf("Invalid Number!\n"); continue; } }
这种强制输入一个float,如果输入的不是一个数字形式,就会强制清除掉然后要求重新输入
这个是我代码的一部分,并不是全部所以这段单独运行起来的话是死循环,可以在出if后在续写,适量填充即可
更多相关内容 -
linux系统中C语言中的清空scanf输入缓冲区
2020-03-08 14:48:00为什么会单独将字符串的输入拿出来讲,因为字符串和其他的输入来说有一点不同,在C语言中,从键盘输入有多个函数 scanf:和 printf()类似,scanf()可以输入多种类型的数据。 getchar()、getche()、getch...为什么会单独将字符串的输入拿出来讲,因为字符串和其他的输入来说有一点不同,在C语言中,从键盘输入有多个函数
- scanf:和 printf()类似,scanf()可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数用于输入单个字符。
- gets():获取一行数据,作为字符串处理
scanf 函数
1 #include <stdio.h> 2 #include <string.h> 3 void sum(); 4 void sub(); 5 6 void sum() 7 { 8 int sum,a,b,c; 9 printf("请输入第一个数\r\n"); 10 scanf("%d",&a); 11 printf("请输入第二个数\r\n"); 12 scanf("%d",&b); 13 sum=a+b; 14 printf("相加的值为%d\r\n",sum); c=getchar(); 15 } 16 void sub() 17 { 18 char arr[]={'z','h','a','n','g'}; 19 char arr1[]="zhang"; 20 long la=sizeof(arr); 21 long la1=sizeof(arr1); 22 printf("%ld,%ld\r\n",la,la1); 23 } 24 25 int main() 26 { 27 char choose; 28 while(1) 29 { 30 printf("*************************************************\r\n"); 31 printf(" 欢迎来到个性化计算器\r\n"); 32 printf(" 请根据提示选择相应的操作\r\n"); 33 printf(" 1:加法 2:减法 3:乘法 4:除法 5:取模\r\n"); 34 printf(" 请输入您的计算法则\r\n"); 35 printf("*************************************************\r\n"); 36 37 scanf("%c",&choose); 38 switch(choose) 39 { 40 case '1': 41 printf("加法运算\r\n"); 42 sum(); 43 break; 44 case '2': 45 printf("减法运算\r\n"); 46 sub(); 47 break; 48 case '3': 49 printf("乘法运算\r\n"); 50 break; 51 case '4': 52 printf("除法运算\r\n"); 53 break; 54 case '5': 55 printf("取模运算\r\n"); 56 break; 57 case '0': 58 printf("程序将在3秒后退出\r\n"); 59 sleep(3); 60 return 0; 61 default: 62 printf("输入数据不合法,请重新输入\r\n"); 63 break; 64 } 65 } 66 return 0; 67 }
结果:
这里问题就在于我想要的是输入1之后,进行加法运算,然后回到选择界面,可这里在进行完之后在我们意料之外输出default的语句。这就是因为输入缓冲区的问题。因为我们使用%c输入,识别到的是两个字符‘1’,‘\n’,所以在我们进行第一次case之后会自动再进行一次default运算。解决的方法就是:
1. 将char类型改为int; 2. 清空缓冲区,在linux下fflush()不能清空缓冲区,此时,我们选择回收字符就可以解决这个问题;有时候我们可以结合while进行使用;
修改后的结果:
-
C语言清空输入缓冲区
2021-05-22 07:41:27来源:http://blog.csdn.net/guanyasu/article/details/53153705https://zhidao.baidu.com/question/5241738.htmlC语言中如何清空输入输出缓冲区上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数...来源:http://blog.csdn.net/guanyasu/article/details/53153705
https://zhidao.baidu.com/question/5241738.html
C语言中如何清空输入输出缓冲区
上述描述似乎能够解决问题了,但是,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缓存
2020-11-26 17:15:41没有进行对scanf缓存区的清空,使得重复输入出现错误的变量。 解决这个问题方法很简单只需要对scanf的缓存进行清空即可,可以运用文件进行操作。 /* fp为文件类型的指针,fgetc是获取文件fp一个字符变量的函数,EOF...在c语言中写有关于输入函数的函数时常常回遇到输入乱码和无法输入的情况
程序的逻辑关系看似没有问题,但是运行的时候会发现递归函数根本没有结束
重新看代码虽说逻辑上没有问题,但是运行条件有疏漏。没有进行对scanf缓存区的清空,使得重复输入出现错误的变量。
解决这个问题方法很简单只需要对scanf的缓存进行清空即可,可以运用文件进行操作。/* fp为文件类型的指针,fgetc是获取文件fp一个字符变量的函数,EOF是文件结束找不到变量的返回值,用回车(\n)作为结束清空scanf缓存区的标志 */ void Safe_flush(FILE *fp)//清空scanf缓冲区内存 { int ch; while( (ch = fgetc(fp)) != EOF && ch != '\n' ); } Status CreatSqList(SqList *L)//创建一个数组 { int i,j; (*L).length = 0; printf("请输入一个大小小于%d的数组(用空格隔开):",MAXSIZE); for(i = 1;i < MAXSIZE;++i){ if(!scanf("%d",&(*L).r[i])){ printf("输入有误请重新输入!\n"); Safe_flush(stdin);//stdin为scanf在c语言中文件类型的指针 CreatSqList(&(*L)); } else (*L).length++; if(getchar() == '\n') break; } return OK; }
由此就可以解决scanf函数乱码和重复输入的问题 -
C语言scanf()与缓冲区
2020-02-08 23:27:13scanf函数返回值 正整数,表示正确输入参数的个数。例如执行 scanf(“%d %d”, &amp;a, &amp;b); 如果用户输入”3 4”,可以正确输入,返回2(正确输入了两个变量); 如果用户输入”3,4”,... -
零基础学C语言 笔记四 Scanf函数清除缓冲区
2021-05-21 16:14:25Scanf函数清除缓冲区之前涉及到scanf会先到缓冲区看看是否存在数据,若存在数据,就直接拿缓冲区的数据过来使用,这就涉及到了一个问题,那如果缓冲区的数据不是我想要的呢?方法一:我们用scanf吸收掉我们的代码... -
c语言清空缓冲区
2021-07-28 17:04:56c语言中的scanf是从输入缓冲读取数据到变量中,而我们输入字符时很容易受缓冲区的影响 比如下面的例子 char c = 0; char a = 0; scanf("%c", &c); scanf("%c", &a); printf("%c,%c",a,c); 可以... -
C语言scanf输入时缓冲区问题
2018-11-04 00:26:35许多同学可能在写代码时都遇到了关于scanf输入时缓冲区读取问题。 首先来对scanf为什么会出现这类问题进行分析,scanf函数是标准输入流(从键盘接收数据),接收的数据放入输入缓冲区中,其中就包括在键盘输入的空格... -
【C语言】清除scanf缓存区的几种方法
2021-10-19 11:15:22方法一:scanf ( “%*[^\n] %*c” ); 【注】: 1.这里的星号 '* '表示读入某类型的内容,但是这个内容不保存到变量里,所以后面不需要对应的参量;...4.所以整行代码的解释是"%*[^\n]"首先读入缓冲区的剩余内容, -
C语言中如何清空输入输出缓冲区
2021-05-20 09:32:44C语言中如何清空输入输出缓冲区答案:5信息版本:手机版解决时间 2019-10-06 09:40已解决2019-10-05 13:54C语言中如何清空输入输出缓冲区最佳答案2019-10-05 15:11最简单的是用fflush()函数。此函数包含在stdio.h... -
[C语言]清空缓存区
2022-02-26 16:14:07C语言的读取是通过缓冲区的形式,即键盘-->缓冲区-->读取。故存在清理缓冲区以达到目的的问题 。 int main() { char password[20] = { 0 }; printf("请输入密码:"); scanf("%s",password);//scanf和... -
c语言输入缓冲区数据清空
2021-11-21 01:05:19解决方法 清空缓冲区 使用一个字符变量存储多余的输入(将缓冲区的变量取出); scanf的返回值小于1时,用getchar获取缓冲区的字符 while ((c = getchar()) != EOF && c != '\n'); 分析 此处备注scanf的相关事项: ... -
C语言scanf函数以及缓存详解
2018-08-21 00:18:27自学到C语言scanf(),printf(),getchar(),gets();的时候,我觉得这个几个函数并没有什么特别的难得,但是后来写程序的时候却出现了一些小错误总是解决不了;上网查了查,是对于C语言缓存的不理解,所以今天本篇博文就... -
C语言之清空缓存区
2021-05-24 02:45:091.缓存区C语言中的缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。C语缓冲区分为三种类型:1、全... -
Linux C语言scanf输入缓冲区清除
2019-12-02 00:00:34最近小编在Linux下编程时遇到这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> void menu(){ printf("请输入1,2,3:"); } void main(){ ... scanf("%d",&cmd);... -
c语言:C语言清空输入缓冲区在标准输入(stdin)情况下的使用
2021-05-24 05:07:58C语言清空输入缓冲区在标准输入(stdin)情况下的使用程序1://功能:先输入一个数字,再输入一个字符,输出hello bit#include int main(){int num = 0;char ch = ' ';scanf("%d", &num);scanf("%c", &ch);... -
第四章 C语言输入输出_C语言清空(刷新)缓冲区,从根本上消除那些奇怪的行为
2022-02-19 16:44:46对于输出操作,清空缓冲区会使得缓冲区中的所有数据立即显示到屏幕上;很明显,这些数据没有地方存放了,只能输出了。 对于输入操作,清空缓冲区就是丢弃残留字符,让程序直接等待用户输入,避免引发奇怪的行为。 ... -
清空输入缓冲器,C语言清空输入缓冲区完全攻略
2021-03-13 01:02:58本节,在学习如何清空输入缓冲区之前,我们先来介绍一下“输入缓冲区”的概念。输入缓冲区所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存的缓冲区中,叫作“键盘输入缓冲区”,简称“输入缓冲区”或... -
C语言清空输入缓冲区的N种方法对比
2021-05-22 06:52:27C语言中有几个基本输入函数://获取字符系列int fgetc(FILE *stream);int getc(FILE *stream);int getchar(void);//获取行系列char *fgets(char * restrict s, int n, FILE * restrict stream);char *gets(char *s);... -
C语言清空缓冲区
2018-12-25 21:52:05C语言中的缓冲区 参阅参考网址详尽 1.缓存区 C语言中的缓冲区又称为缓存,它是内存空间的一部分。 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做... -
c语言缓冲区类型,清空缓冲区,谈getchar、getch、getche
2019-01-06 23:10:42C语言缓冲区(缓存)详解 缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,在内存中 预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲 区。 缓冲区根据其对应... -
【C语言】scanf,fgets,fputs缓冲区问题
2021-05-25 09:00:58因为scanf函数规定:在scanf函数接收数据时,遇到以下情况之一则结束一个数据的输入,(1) 遇到空格、回车、跳格键(2)遇到宽度结束(3)遇到非法输入2 在用%d控制字符输入数据时,系统会忽略掉空白字符,在用%c控制字符... -
C语言 scanf的工作原理
2022-01-03 22:06:39先来观察一段代码和运行结果: #include <iostream> using namespace std; int main() { int a;...该代码明明有两个 scanf ,但在运行过程中,执行完第一个 scanf 和 printf 后,代码直接 -
scanf函数的缓冲区问题
2021-05-21 16:14:26当用户输入数据的时候,输入的数据并不是直接赋给scanf指定的变量,而是先存储到我们的缓冲区,scanf函数再从缓冲区取数据 . 如果取出的数字 , 整数或者小数 , 缓存区的空格 , tab , 回车就会自动被忽略 ... -
C语言如何清除scanf()缓存
2021-05-21 18:00:47(1)清除缓存的函数是:void safe_flush(FILE *fp){...}(2)然后我们在使用的时候,直接调用就可以了:scanf("%d",&k);safe_flush(stdin);这样就可以清除缓存带来的问题了!(3)案例演示a.当我们不清除scanf所带来... -
C语言输入输出缓冲区和清空输入缓冲区的一种方式
2020-07-28 10:16:17全缓冲:在这种情况下,当缓冲区被填满后才进行真正的输入输出操作,缓冲区的大小都是有限制的,数据量达到最大值就清空缓冲区。 行缓冲:当在输入或输出的过程中遇到换行符时,才执行真正的输入输出操作。scanf()、... -
scanf函数读取缓冲区数据的问题
2020-11-22 01:01:14C语言scanf输入时缓冲区问题 简单解释 问题程序 #include <stdio.h> int main() { char a; while(1) { scanf("%c",&a); switch(a) { case 'A':printf("85~100\n");break; case 'B':printf("75~84\...