精华内容
下载资源
问答
  • 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语言中如何清空输入输出缓冲区

    4d337068a4863146725bb3b1f1794425.png

    上述描述似乎能够解决问题了,但是,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语言清空输入缓冲区在标准输入(stdin)情况下的使用。
  • C语言 清空输入缓冲区的方法

    千次阅读 2017-09-27 13:00:16
    用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的 ASCII码 ,如出错...
    问题描述:
    #include<stdio.h>
    void main(){
     int a;
     char b;
     printf("input a integer\n");
     scanf("%d",&a);
     //这里需要清除回车符
     printf("input a char\n");
     scanf("%c",&b);
    
     printf("%d,%c\n",a,b);
    }
    想要得到的输出结果:
    input a integer
    9
    
    
    input a char
    a
    
    
    9 a
    
    
    可用方法:
    (1)用getchar()清除getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。
    (2)用 scanf("%1s",&b) 来限制:读取一个字符
    (3)用格式串中空格或 scanf("%*c",&b)  来"吃掉":scanf格式中,如果在%后面、格式字符前面加上一个“*”附加说明符,表示跳过该输入,输入的数据不放入变量中。
    (4)用函数fflush(stdin)清除全部剩余内容:fflush(stdin) 功能是清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);).应注意此函数仅适用于部分编译器(如VC6),但是并非所有编译器都要支持这个功能(如gcc3.2)。这是一个对C标准的扩充,所以不推荐使用。
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    展开全文
  • 所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存的缓冲区中,叫作“键盘输入缓冲区”,简称“输入缓冲区”或“输入流”。 我们来设计一个程序: 设置密码,将密码保存到一个数组里,保存成功或失败都...

    一、简单概述

    输入缓冲区

    所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存的缓冲区中,叫作“键盘输入缓冲区”,简称“输入缓冲区”或“输入流”。

    我们来设计一个程序:

    设置密码,将密码保存到一个数组里,保存成功或失败都有提示。

    按照思路,我们编写以下代码

    void main()
    {
    	int ch=0;
    	int a=0;
    	char sb[]={0};
    	printf("Please set your password:\n");
    	scanf("%s",sb);
    	printf("Are you sure?Y/N\n");
    	if ((a=getchar())=='Y')
    		printf("Password set successfully!");
    	else
    		printf("Password set failure!");
    }

    在visual c++2010版本下编译并运行,得到以下结果:

    我们发现当输入完成密码后,应当执行判断语句并等待输入:

    if ((a=getchar())=='Y')

    但是程序却没有等待输入,直接打印else部分。是什么原因造成的呢?

    造成程序功能混乱的原因是——没有清除输入缓冲区。

    当程序执行getchar()或scanf()等输入函数时,会向自动向输入缓冲区寻找字符,并将其获取。那么我们会发现,由于程序执行scanf("%s",sb)时我们输入完一串字符后,按下回车进行确定,而回车也被认为是一个字符,被保留在输入缓冲区中。故当程序执行到 if ((a=getchar())=='Y')时,输入缓冲区中还剩一个字符未清理,导致语句if的判断条件为假故导致程序不会等待输入直接执行else语句内容。

    那么如何清理输入缓冲区呢?

    我们的思路是通过一条或几条语句将输入缓冲区的内容在执行下一条输入函数之前全部获取。

    如何实现?

    我们知道字符串的结束标志是\n,那么我们可以利用循环语句,判断输入缓冲区内的字符是否是\n,如果是这说明输入缓冲区已经没有任何字符,如果有就利用循环和输入函数将其获取,达到清空目的。

    按照上面思路,程序修改如下:

    void main()
    {
    	int ch=0;
    	int a=0;
    	char key[]={0};
    	printf("Please set your password:\n");
    	scanf("%s",key);
    	while((ch=getchar())!= '\n')//清空输入缓冲区
    		;//空语句
    	printf("Are you sure?Y/N\n");
    	if ((a=getchar())=='Y')
    		printf("Password set successfully!");
    	else
    		printf("Password set failure!");
    }

    我们在第一次执行完输入函数后外加语句:

    while((ch=getchar())!= '\n')//清空输入缓冲区
            ;//空语句

    来判断输入缓冲区内的字符是否是\n,如果是这说明输入缓冲区已经没有任何字符,如果有就利用循环和输入函数将其获取,达到清空目的。

    程序执行如下,我们输入字符串"abc"作为密码:

    程序成功执行。

    总结:

    使用输入函数scanf()和getchar()时一定要注意输入缓冲区内是否有元素,并养成及时清理输入缓冲区的习惯! 

    展开全文
  • C语言中如何清空输入输出缓冲区答案:5信息版本:手机版解决时间 2019-10-06 09:40已解决2019-10-05 13:54C语言中如何清空输入输出缓冲区最佳答案2019-10-05 15:11最简单的是用fflush()函数。此函数包含在stdio.h...

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

    答案:5  信息版本:手机版

    解决时间 2019-10-06 09:40

    已解决

    2019-10-05 13:54

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

    最佳答案

    2019-10-05 15:11

    最简单的是用fflush()函数。

    此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。

    函数原型:int fflush(FILE *stream) ;

    函数功能:清除一个流,即清除文件缓冲区.

    常用场合:

    一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

    fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

    二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    键盘缓冲区就可能有残余信息问题。

    scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中

    解决就要在scanf()函数之后加个fflush(stdin)

    三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写

    FILE *fp=fopen("a.txt","w");

    fprintf(fp,"abcdef");

    fflush(fp);

    全部回答

    1楼

    2019-10-05 19:51

    我暂时保留我的看法!

    2楼

    2019-10-05 18:23

    1、flush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

    fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

    2、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    键盘缓冲区就可能有残余信息问题。

    scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中

    解决就要在scanf()函数之后加个fflush(stdin)。

    3楼

    2019-10-05 16:57

    flush(stdin) flush(stdin)是用来清空输入缓冲区,通常是为了确保不影响后面的数据读取,例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行flush(stdin)。

    例如

    scanf("%s",tmp);

    scanf("%c",&ch);

    之间如果没有flush(stdin);那么ch中就接收的是换行了

    表现为直接跳过了这一步

    4楼

    2019-10-05 16:29

    最简单的是用fflush()函数。

    此函数包含在stdio.h头文件中,用来强制将缓冲区中的内容写入文件。

    函数原型:int fflush(FILE *stream) ;

    函数功能:清除一个流,即清除文件缓冲区.

    常用场合:

    一、ff(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃

    fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。

    二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    键盘缓冲区就可能有残余信息问题。

    scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中

    解决就要在scanf()函数之后加个fflush(stdin)

    三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写

    FILE *fp=fopen("a.txt","w");

    fprintf(fp,"abcdef");

    fflush(fp);

    我要举报

    如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

    大家都在看

    推荐资讯

    展开全文
  • C语言清空输入缓冲区在标准输入(stdin)情况下的使用程序1://功能:先输入一个数字,再输入一个字符,输出hello bit#include int main(){int num = 0;char ch = ' ';scanf("%d", &num);scanf("%c", &ch);...
  • C语言中有几个基本输入函数://获取字符系列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语言清空输入缓冲区在标准输入(stdin)情况下的使用程序1://功能:先输入一个数字,再输入一个字符,输出hello bit#include int main(){int num = 0;char ch = ' ';scanf("%d", &num);scanf("%c", &ch);...
  • 经常我们想在屏幕上看一个结果或输入内容的时候,却不等待你输入就结束了,此时就需要刷新输入缓冲区。题目:先来看一个栗子:实现登录时确认密码,输入Y即确认成功,N表示放弃确认。int main(){char password[20] =...
  • 虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。 # include int main ( void ) { int i , c ; while...
  • (转自:... C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列...
  • 为什么会单独将字符串的输入拿出来讲,因为字符串和其他的输入来说有一点不同,在C语言中,从键盘输入有多个函数 scanf:和 printf()类似,scanf()可以输入多种类型的数据。 getchar()、getche()、getch...
  • //清空缓冲区 b = getchar(); if(b == '1'){ printf("b = 1\n"); }else{ printf("b != 1\n"); } 运行结果如图: 调用函数把缓冲区里的空间删除,于是乎就可以输入第二个字符了 留一个问题: #include int main() { ...
  • C语言清空getchar缓冲区

    千次阅读 2013-09-28 23:21:34
    今天写到这样一个函数 char c; do{ c=getchar(); ... ...Baidu一下,原来getchar()采用了缓冲区,而getch()才是立即获取,所以要想再用getchar()获取正确的值必须先清空缓冲区,如果是window
  • <br />C语言中有几个基本输入函数://获取字符系列int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列char *fgets(char * restrict s, int n, FILE * restrict stream); ...
  • C/C++ 四种清空输入缓冲区的方法

    万次阅读 多人点赞 2020-02-05 10:19:34
    C语言清空输入缓冲区的所有内容,在VS中没有效果 ============================================================= 二、 cin.sync(); C++:清除输入缓冲区的所有内容,在VS中没有效果 ===========================...
  • 第四期2006年12月益阳职业技术...在进行数据输入时,有时会发生因键盘缓冲区中有键值而导致输入数据有误,本文介绍在C语言程序中清除缓冲区中键值的方法。[关键词]键盘缓冲区[中图分类号]TP316C...
  • 全缓冲:在这种情况下,当缓冲区被填满后才进行真正的输入输出操作,缓冲区的大小都是有限制的,数据量达到最大值就清空缓冲区。 行缓冲:当在输入或输出的过程中遇到换行符时,才执行真正的输入输出操作。scanf()、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,562
精华内容 4,624
关键字:

c语言清空输入缓冲区

c语言 订阅