精华内容
下载资源
问答
  • 清空输入缓冲区
    千次阅读
    2019-03-24 23:49:49

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

    #include<stdio.h>
    int main(void)
    {
    	int a, b, c;
    	scanf("%d", &a);
    	printf("%d\n", a);
    	scanf("%d", &b);
    	printf("%d", b);
    	scanf("%d", &c);
    	printf("%d", c);
    	return 0;
    }
    

    从输出结果可以看出,不管是一个一个地输入:1(回车)2(回车)3(回车);还是三个数字一次性输入:1(空格)2(空格)3(空格),这两种方式结果都是一样的,原因就是从键盘输入的数据都会依次存入缓冲区,不管是数字还是字符都会被当成数据存进去。但是只有按下回车,scanf才会将数据存进缓冲区中,因此不管我们怎么输入,我们可以存一个取一个,也可以一次性全存入进去,然后一个个取。

    %d和%c读取缓冲区的差别
    对于%d,在缓冲区中,空格,回车,Tab键都只是分割符,
    不会被scanf当成数据取用,%d遇到过他们就会跳过,取下一个数据。但是如果是%c,那么空格,回车,Tab键都会被当成是数据给scanf取用,

    
                                            
    更多相关内容
  • 本文主要介绍C语言清空输入缓冲区在标准输入(stdin)情况下的使用。
  • 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种方法对比&lpar;转&rpar;

    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&plus;&plus;中清空输入缓冲区的方法&lpar;做cf的时候炸了&rpar;

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

    &lbrack;转&rsqb;&lbrack;修&rsqb;C清空输入缓冲区

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

    (转)关于fflush&lpar;stdin&rpar;清空输入缓存流&lpar;C&sol;C&plus;&plus;&rpar;

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

    scanf&lpar;&rpar;中清除输入缓冲区的几种方法归纳

    应用场景:我们使用多个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基础--集合、文件操作&amp&semi;函数

    本节内容 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&period;0 学习:参数和特征的提取

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

    展开全文
  • 怎样较为完善地清空输入缓冲区一个简单的测试程序对比得出清除缓冲区作用:未加清除缓冲功能的测试程序:#includevoid CreateFile(void){}void OpenFile(void){}void SaveFile(void){}void CmdRunning(){int iCmdNum...

    怎样较为完善地清空输入缓冲区

    一个简单的测试程序对比得出清除缓冲区作用:

    未加清除缓冲功能的测试程序:#include

    void CreateFile(void)

    {}

    void OpenFile(void)

    {}

    void SaveFile(void)

    {}

    void CmdRunning()

    {

    int iCmdNum = 0;

    void (*pCmd)() = NULL;

    do

    {

    pCmd = NULL;

    printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");

    iCmdNum = getchar();//此时输入的是字符

    //fflush(stdin);//清空缓冲区

    switch(iCmdNum)

    {

    case '0':printf("谢谢使用,再见!\n");

    break;

    case '1':pCmd = CreateFile;

    break;

    case '2':pCmd = OpenFile;

    break;

    case '3':pCmd = SaveFile;

    break;

    default:printf("对不起,你选择的数字不存在,请重新选择!\n");

    }

    if(NULL!=pCmd)

    {

    pCmd(); // 与(*pCmd)();等价 (*pCmd)()

    }

    }while('0'!=iCmdNum);

    }

    int main(void)

    {

    CmdRunning();

    return 0;

    }

    实验结果:

    103427207.png

    加上清除缓冲功能以后:

    #include

    void CreateFile(void)

    {}

    void OpenFile(void)

    {}

    void SaveFile(void)

    {}

    void CmdRunning()

    {

    int iCmdNum = 0;

    void (*pCmd)() = NULL;

    do

    {

    pCmd = NULL;

    printf("请选择:0. 退出;1. 新建文件;2. 打开文件;3. 保存文件\n");

    iCmdNum = getchar();//此时输入的是字符

    fflush(stdin);//清空缓冲区

    switch(iCmdNum)

    {

    case '0':printf("谢谢使用,再见!\n");

    break;

    case '1':pCmd = CreateFile;

    break;

    case '2':pCmd = OpenFile;

    break;

    case '3':pCmd = SaveFile;

    break;

    default:printf("对不起,你选择的数字不存在,请重新选择!\n");

    }

    if(NULL!=pCmd)

    {

    pCmd(); // 与(*pCmd)();等价 (*pCmd)()

    }

    }while('0'!=iCmdNum);

    }

    int main(void)

    {

    CmdRunning();

    return 0;

    }

    103427208.png

    清除缓冲区,这里缓冲区有我们实验输入时不小心或者是不得不产生的回车符影响,fflush(stdin);把回车符从缓冲区中清除掉。

    清除缓冲区的几个方法:

    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);//可能导致溢出,用fgets代替之。//格式化输入系列int fscanf(FILE * restrict stream, const char * restrict format, …);int scanf(const char * restrict format, …);int sscanf(const char * restrict str, const char * restrict format, …);

    这里仅讨论输入函数在标准输入(stdin)情况下的使用。纵观上述各输入函数,

    获取字符系列的的前三个函数fgetc、getc、getchar。以getchar为例,将在stdin缓冲区为空时,等待输入,直到回车换行时函数返回。若stdin缓冲区不为空,getchar直接返回。getchar返回时从缓冲区中取出一个字符,并将其转换为int,返回此int值。

    _CRTIMP int __cdecl getchar(void);

    清除方法:

    (1)fflush(stdin)

    在C99中:

    If stream points to an output stream or an update stream in which the most recent

    operation was not input, the fflush function causes any unwritten data for that stream

    to be delivered to the host environment to be written to the file; otherwise, the behavior is

    undefined.

    如果流指向一个输出流或着更新流,并且这个更新流最近的操作不是输入的情况下,fflush函数会导致任何的由于流被传入到宿主环境(宿主环境可以理解为操作系统或内核)的不成文数据(待写数据)被写入文件当中,否则,这种行为是未定义的。

    由上面可知对于fflush输入流为参数的行为是未定义的。(所以如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用fflush(stdin)是不正确的。

    )

    但是在VC的MSDN中写到:

    If the file associated with stream is open for output, fflush writes to that file the

    contents of the buffer associated with the stream. If the stream is open for input,

    fflush clears the contents of the buffer.

    如果文件相关流为输出而打开着,fflush向该文件写入相关流。如果是为了输入而打开,则fflush清空缓冲区内容。

    由此可知fflush(stdin)为清空输入缓冲区是有作用的。

    (2)

    setbuf (stdin,NULL);

    setbuf(stdin, NULL);是使stdin输入流由默认缓冲区转为无缓冲区。都没有缓冲区了,当然缓冲区数据残留问题会解决。但这并不是我们想要的。

    (3)

    scanf("%*[^\n]");这里用到了scanf格式化符中的“*”,即赋值屏蔽;“%[^集合]”,匹配不在集合中的任意字符序列。这也带来个问题,缓冲区中的换行符’\n’会留下来,需要额外操作来单独丢弃换行符。

    (4)最佳方案:

    int c;

    while((c=getchar()) != '\n' && c!=EOF);

    由代码知,不停地使用getchar()获取缓冲区中字符,直到获取的字符c是换行符’\n’或者是文件结尾符EOF为止。这个方法可以完美清除输入缓冲区,并且具备可移植性。

    合理的结论:

    由以上分析可知,在C语言中清空输入缓冲区的最佳方法是在一个循环中不断获取输入流中的残留数据并把它”吃掉“来起到清除输入缓冲区的作用。

    简单例子:

    #include

    int main(void)

    {

    int i,c;

    for(;;)

    {

    fputs("Please input an integer :",stdout);

    scanf("%d",&i);

    if( feof(stdin) || ferror(stdin) )

    {

    /* 如果用户输入文件结束标志(或文件已被读完), */

    /* 或者发生读写错误,则退出循环 */

    break;

    }

    /* 没有发生错误,清空输入流。 */

    /* 通过 while 循环把输入流中的余留数据“吃”掉 */

    while((c=getchar())!='\n' && c!=EOF);

    printf("%d\n",i);

    }

    return 0;

    }

    当输入8并进行单步调试出现以下结果:

    103427209.png

    103427210.png

    输入80

    103427211.png

    c的值始终为10!!!因为回车符的值为0x0A 嘛~~~~

    展开全文
  • 需要清空输入缓冲区 #include <iostream> #include <Windows.h> using namespace std; int main(void) { int a, b ,c; cout << "请输入a: "; cin >> a; if (cin.fail()) { // 如果...

    使用std::cin输入数据时,前面的数据输入错误,导致后面的数据都不能输入
    需要清空输入缓冲区

    #include <iostream>
    #include <Windows.h>
    
    using namespace std;
    
    int main(void) {
    	int a, b ,c;
    
    	cout << "请输入a: ";
    	cin >> a;
    	if (cin.fail()) {	// 如果输入发生错误
    		cout << "输入错误, 请重新输入一个整数!" << endl;
    		cin.clear();		// 清除错误标志, 使后续正常输入, 但错误的数据还在输入缓冲区
    		cin.ignore();		// 清除缓冲区的一个字符
    	} 
    
    	cout << "请输入b: ";
    	cin >> b;
    	if (cin.fail()) {	// 如果输入发生错误
    		cout << "输入错误, 请重新输入一个整数!" << endl;
    		cin.clear();	// 清除错误标志
    		cin.ignore();		// 清除一个字符
    	}
    
    	cout << "请输入c: ";
    	cin >> c;
    	if (cin.fail()) {	// 如果输入发生错误
    		cout << "输入错误, 请重新输入一个整数!" << endl;
    		cin.clear();	// 清除错误标志
    		cin.ignore();		// 清除一个字符
    	}
    
    	cout << a << endl;
    	cout << b << endl;
    	cout << c << endl;
    
    	system("pause");
    	return 0;
    }
    
    展开全文
  • 问题描述:输入数据时希望有个合法性检验的问题,如果输入的数据不合法则程序提示重新输入。最初代码如下:#include #include using std::cin ;using std::cout ;using std::endl;using std::vector ;int main(){int...
  • 对C 语言初学者来说,fflush(stdin)函数被解释为会清空输入缓冲区的一个系统函数,这是一个曾经几乎对过一半的说法,随着计算机科学的进步,在学习的过程中的逐步完善,将fflush(stdin)函数的过去与现在分析一下。...
  • C/C++ 四种清空输入缓冲区的方法

    千次阅读 2021-01-15 07:16:22
    C/C++ 四种清空输入缓冲区的方法C/C++ 四种清空输入缓冲区的方法一、fflush(stdin);C语言:清空输入缓冲区的所有内容,在VS中没有效果二、cin.sync();C++:清除输入缓冲区的所有内容,在VS中没有效果三、cin.ignore...
  • 全缓冲:在这种情况下,当缓冲区被填满后才进行真正的输入输出操作,缓冲区的大小都是有限制的,数据量达到最大值就清空缓冲区。 行缓冲:当在输入或输出的过程中遇到换行符时,才执行真正的输入输出操作。scanf()、...
  • vs2017下清空输入缓冲区(c/c++)

    千次阅读 多人点赞 2019-12-28 22:53:28
    在网上找了挺久好像都只说了什么fflush,rewind,cin的什么什么函数,但貌似都没有能够真正的在vs2017下清空输入缓冲区的。 隐约记得以前我已经试过清空了,但是又忘记了是什么,翻翻以前的代码才找到。 ...
  • C语言中如何清空输入输出缓冲区答案:5信息版本:手机版解决时间 2019-10-06 09:40已解决2019-10-05 13:54C语言中如何清空输入输出缓冲区最佳答案2019-10-05 15:11最简单的是用fflush()函数。此函数包含在stdio.h...
  • C++cin详解及清空输入缓冲区

    万次阅读 多人点赞 2018-01-15 19:34:42
    一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin对象直接从输入缓冲区中取数据。正因为cin对象是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin对象会直接取得这些...
  • Java清空输入缓冲区的一种方法

    万次阅读 2017-03-13 23:20:45
    在一个循环体内,对一个整型变量进行输入,如果输入的不是整数,则会输出异常,并且变成死循环 使用Scanner的nextInt时,如果输入的是一个字符的话,就会有InputMismatchException异常产生,用一个while(true)循环...
  • Linux下如何清空输入缓冲区

    千次阅读 2015-11-08 22:51:46
    今天在Linux下编写数据结构课程的一个旅游管理程序时,遇到了一些有关键盘输入缓冲区的问题。 使用scanf函数进行等待用户输入时,用户输入完会在缓冲区里遗留一个换行符 '\n',如果不清除掉这个换行符,就会在下一...
  • C语言 清空输入缓冲区的方法

    千次阅读 2017-09-27 13:00:16
    功能是清空输入 缓冲区 ,通常是为了确保不影响后面的数据读取(例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin);).应 注意此函数仅适用于 部分编译器 (如 VC6 ),但是并非所有...
  • 为什么会单独将字符串的输入拿出来讲,因为字符串和其他的输入来说有一点不同,在C语言中,从键盘输入有多个函数 scanf:和 printf()类似,scanf()可以输入多种类型的数据。 getchar()、getche()、getch...
  • 如图 ,由于之前游戏时键入了很多空格、回车等,(之前没有cin过)cin输入时光标不在提示语(即冒号)之之后,而是跑到了别处。 用过cin.sync(); cin.ignore(...); 可是不起作用。 在下初来CSDN,没有赏金,有...
  • 经常我们想在屏幕上看一个结果或输入内容的时候,却不等待你输入就结束了,此时就需要刷新输入缓冲区。题目:先来看一个栗子:实现登录时确认密码,输入Y即确认成功,N表示放弃确认。int main(){char password[20] =...
  • 但如果第一次没有输入有效字符(比如输入ctrl+z,回车)或者第一个输入为非法字符,则程序陷入死循环,不停的输出提示信息,但是不允许用户再次输入。 原因: 如果第一次没有输入有效字符,以...
  • 清空输入缓冲区的方法

    千次阅读 2011-06-16 14:53:00
    清空缓冲区的方法 1.输入输出缓冲区的概念(C++用的多一些) 我想以一个例子说明,比如我想把一篇文章以字符序列的方式输出到计算机显示器屏幕上,那么我的程序内存作为数据源而显示器驱动程序作为数据目标,如果...
  • C++中清空标准输入缓冲区的一种...简要说明:在vs中使用cin.sync()清理输入缓冲区是没有效果的,因此我们需要使用另外一种方法达到清空输入缓冲区的数据。 用法: cin.ignore(std::numeric_limits::max(),’\n’) ...
  • 不论从 字面意思 还是 某些技术文档 中,都可以看到 fflush(stdin) 是对标准输入缓冲区清空的标准方案; 然而,并不是! 深入了解一下 fflush(stdin) 之后,才发现这个锅得自己背,怪自己喜欢拿来就用,不去深入了解...
  • C语言数组,一维二维数组创建及初始化,字符串输入与输出,字符串指针,函数中的数组传参,冒泡&选择排序,冒泡排序优化。
  • 虽然不可以用 fflush(stdin),但是我们可以自己写代码来清空输入缓冲区。只需要在 scanf 函数后面加上几句简单的代码就可以了。 # include int main ( void ) { int i , c ; while...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,476
精华内容 21,390
关键字:

清空输入缓冲区

友情链接: SocksRedirector.zip