-
2019-12-28 22:53:28
在网上找了挺久好像都只说了什么fflush,rewind,cin的什么什么函数,但貌似都没有能够真正的在vs2017下清空输入缓冲区的。
隐约记得以前我已经试过清空了,但是又忘记了是什么,翻翻以前的代码才找到。
代码如下:while (_kbhit()) { getch(); } rewind(stdin);
说明:_kbhit()函数是检测按键是否有按下的一个不阻塞函数,只要有按下就返回一个非零值。
getch()读取一个字符。
rewind(stdin);就是缓冲区指针指向开头。
头文件:
#include <stdlib.h>
#include <conio.h>
在vs2017下使用这个几条语句能有效清空输入缓冲区噢。可以封装成一个函数。
当然如果你的还是不行就继续百度吧!!
如果可以了记得点个赞让我开心一哈(这才是发博客的真正目的)更多相关内容 -
C++基础知识 - 清空输入缓冲区
2021-12-22 23:06:31需要清空输入缓冲区 #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; }
-
C/C++清理输入缓冲区中的内容
2022-05-13 16:22:531.清理输入缓冲区最后剩下的单个回车符:方法一:用getchar函数读取回车符,方法二:用scanf("%*c")读取掉回车符,方法三:用scanf(" %c",&ch)。 2.清理输入缓冲区中剩下的所有内容:方法一:用getchar函数结合循环...C/C++清理输入缓冲区中的内容
1.清理输入缓冲区最后剩下的单个回车符:
scanf读取字符时遇到空格和回车符时都会停止读取,如上述代码,我们输入abcdefgh然后按下回车键,此时输入缓冲区内容:abcdefgh\n,输入缓冲区遇到\n,scanf语句开始读取,scanf语句会把我们输入的字符串abcdefgh存储到字符数组intput中,遇到\n停止,因此此时输入缓冲区还剩一个\n,被getchar读取,并赋值给变量ch,故此时ch = ‘\n’,所以会输出确认失败。
应对这种情况,我们只需要事先将输入缓冲区中最后的回车字符读取掉就可以了:
方法一:用getchar函数读取回车符:
我们输入abcdefgh并按下回车键,此时输入缓冲区的内容为:abcdefgh\n,输入缓冲区遇到\n,scanf开始读取,scanf会把abcdefgh读取并存储到字符数组中,遇到\n后停止,此时输入缓冲区的内容为:\n,然后用getchar函数读取输入缓冲区中最后的单个回车符,这个时候输入缓冲区就清空了,后面的程序得以正常执行。
方法二:用scanf(“%*c”)读取掉回车符:
scanf(“%*c”):读取单个字符。
我们输入abcdefgh并按下回车键,此时输入缓冲区的内容为:abcdefgh\n,输入缓冲区遇到\n,scanf开始读取,scanf会把abcdefgh读取并存储到字符数组中,遇到\n后停止,此时输入缓冲区的内容为:\n,然后用scanf(“%*c”)读取输入缓冲区中最后的单个回车符,这个时候输入缓冲区就清空了,后面的程序得以正常执行。方法三:用scanf(" %c",&ch):
scanf(" %c,&ch):输入缓冲区最后的单个回车符会被%c前面的空格读取,这样我们最后输入的字符就会被scanf读取并赋值给变量ch:
2.清理输入缓冲区中剩下的所有内容:
仔细看下图代码,为什么又出现了上述情况,还没等我们输入,程序就自动输出确认失败了:
当我们输入hhh wwrer时并按下回车键后,此时输入缓冲区的内容为:hhh wwrer\n,然后由scanf语句进行读取,当scanf语句读取字符串的时候,读到空格就结束了,此时输入缓冲区的内容为: wwwrer\n,因此第一个getchar()就会把空格读进去,然后第二个getchar就把‘w’读进去了并赋值给变量ch,然后执行下面的if语句,那肯定会直接输出确认失败。
所以当我们需要重新输入字符让getchar()读取的时候,我们最好先清理键盘缓冲区中的所有内容,我们可以考虑用下面代码来清理缓冲区:
方法一:用getchar函数结合循环语句 :
int tmp = 0; while ((tmp = getchar()) != '\n') { ;//空语句 }
这段代码会把键盘缓冲区中的所有字符包括回车字符也读取掉,那么在之前的代码中加入上述清理缓冲区代码:
如图所示:scanf将hehe读取到字符数组中后,输入缓冲区中的剩余字符都被清理了,程序得以正常执行。
方法二:用scanf(“%*[^\n]”):
scanf(“%*[^\n]”):表示从缓冲区中读取掉任意字符,只要不是\n就⼀直进⾏,遇到\n才停下。这时输入缓冲区中还剩下一个\n,那么又回到了最开始讨论的问题,清除输入缓冲区中最后的单个回车符:用scanf(“%*c”)和getchar函数:
先输入hehe sdsdsd按下回车键,此时输入缓冲区的内容为:hehe sdsdsd\n,输入缓冲区遇到\n,故第一条scanf语句开始读取,scanf遇到空格停止,此时输入缓冲区中的内容为: sdsdsd,然后开始清空缓冲区,由第二条scanf语句开始读取,遇到\n停止,此时输入缓冲区的内容为:\n,然后第三条scanf语句开始读取\n,最终输入缓冲区清空,程序得以正常执行。
-
C/C++ 四种清空输入缓冲区的方法
2020-02-05 10:19:34C语言:清空输入缓冲区的所有内容,在VS中没有效果 ============================================================= 二、 cin.sync(); C++:清除输入缓冲区的所有内容,在VS中没有效果 ===========================...一、
fflush(stdin);
C语言:清空输入缓冲区的所有内容,在VS中没有效果
二、
cin.sync();
C++:清除输入缓冲区的所有内容,在VS中没有效果
三、
cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);
C++:清除输入缓冲区的所有内容,直到遇到回车符为止, 各种编译器都有效
简要说明:
cin.ignore(count, c);
从输入流中提取并丢弃字符,直到遇到下列三种情况
1.提取的字符达到了参数count指定的数量
2.在输入序列中遇到文件结束(EOF)
3.输入序列中的下一个字符为参数c指定的字符(这个字符会被提取并丢弃)
可以写成: cin.ignore(10, ‘\n’);
提取输入缓冲区中的数据,直到遇到回车符,当读取的数据到达十个时,就会停止提取,不会继续提取到回车符。(限制提取十个数据)count常常取:
std::numeric_limits< std::streamsize >::max() 相当于IO流的最大字符个数常见用法:(把标准输入缓冲区cin的所有数据都清空)
cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);注意:
1.cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);在有包含头文件#include <Windows.h>时是无法使用的;2.因为该头文件已经包含了宏定义min 和 max,再使用就会优先调用头文件#include<Windows.h>中的宏定义,就会起冲突,从而导致报错;
3.如果有要求要包含头文件#include <Windows.h>,而且还要使用cin.ignore(std::numeric_limits< streamsize >::max(), ‘\n’);的话,需要在包含头文件#include<Windows.h>之前加上一句
#define NOMINMAX
,限定头文件#include<Window.h>中的宏定义min 和 max 就行了;4.或者直接删去头文件#include<Windows.h>也可以解决问题
5》》》》》》》》》》》》》》》》》》》》》》》》》》》》
还有一种解决方法:
cin.ignore((std::numeric_limits< streamsize >::max)(), ‘\n’);
在回车符前面加上一个括号就可以了,因为不加()的话,max 就和系统中已经有的,预定义的max宏函数混淆了。附上报错截图:
四、
char c;
while ((c = getchar()) != ‘\n’);C/C++:循环读取输入缓冲区的数据,直到遇到回车符为止,效果等效于:清空输入缓冲区的所有数据,直到遇到回车符为止。 在各种编译器中有效。
-
C++cin详解及清空输入缓冲区
2018-01-15 19:34:42一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin对象直接从输入缓冲区中取数据。正因为cin对象是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin对象会直接取得这些... -
C++ 清空输入缓存区的问题 初学 麻烦各位
2016-09-25 12:09:17``` #include using namespace std; int main(void) { int temp = -1;... 按理说输入一个非数字应该会清空输入缓冲区后提示我再次输入才对.. 但是变成了死循环. 初学者 麻烦各位帮帮看看 感激不尽 -
C++中清空缓冲区的方法
2018-04-03 11:07:11问题描述:输入数据时希望有个合法性检验的问题,如果输入的数据不合法则程序提示重新输入。最初代码如下:#include <iostream>#include <vector>using std::cin ;using std::cout ;... -
【fflush】Linux环境下清空标准输入缓冲区 fflush(stdin) 无效
2018-11-27 14:58:15不论从 字面意思 还是 某些技术文档 中,都可以看到 fflush(stdin) 是对标准输入缓冲区清空的标准方案; 然而,并不是! 深入了解一下 fflush(stdin) 之后,才发现这个锅得自己背,怪自己喜欢拿来就用,不去深入了解... -
在C ++中清除输入缓冲区
2020-04-16 21:47:24所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存中的一个缓冲区里面,叫做键盘缓冲区,简称输入缓冲区或者输入流。 当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中... -
c++ 清空控制台_C 语言清空输入缓冲区的几个手段
2020-11-22 16:25:03先观察如下代码和运行情况:按照控制台...造成这种现象的原因是 C 语言的输入缓冲区的机制。什么是 C 语言的输入缓冲区呢?输入分为两种,一种称为无缓冲输入(或直接输入),即你每输入一个字符,程序就读一个字... -
c++清空串口缓冲区
2019-01-24 13:00:23缓冲区控制 Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile,... -
VS-c++控制台清空缓冲区
2021-06-22 08:49:45如题,简略代码如下 //清空缓冲区 void ReCin(){ char ch; while ((ch = getchar()) != '\n' && ch != EOF); } -
C语言清空输入缓冲区
2021-05-22 07:41:27来源:http://blog.csdn.net/guanyasu/article/details/53153705https://zhidao.baidu.com/question/5241738.htmlC语言中如何清空输入输出缓冲区上述描述似乎能够解决问题了,但是,fflush( )并不是标准C语言库函数... -
cin的用法及清空输入缓冲区问题
2020-12-20 02:34:09问题描述:输入数据时希望有个合法性检验的问题,如果输入的数据不合法则程序提示重新输入。最初代码如下:#include #include using std::cin ;using std::cout ;using std::endl;using std::vector ;int main(){int... -
read IO操作详解 之 fflush清空输入缓冲区(转)
2021-05-26 05:36:31C/C++ 误区:fflush(stdin)1.为什么 fflush(stdin) 是错的首先请看以下程序:#include int main( void ){int i;for (;;) {fputs("Please input an integer: ", stdout);scanf("%d", &i);printf("%d\n", i);}... -
c++检测输入合法性,清空输入缓冲区
2020-03-27 15:47:10C++检测输入合法性,并进行重复输入 在用户输入时并不想通过重新运行来输入,于是就用cin.fail()和cin.clean+cin.ignore()来完成 #include <iostream> using namespace std; int main() { int x; cout <<... -
c/c++常见的清空输入缓存区用法
2020-09-27 21:56:06c++ 清空缓存区经常用的函数 #include std::cin.fail() : 该函数返回值bool类型,当输入的数据类型不匹配时,该函数返回值为false此时无法从输入缓存区取值. std::cin.clear() : 该函数的作用为清除错误标志,表示std:... -
c++中cin缓冲区
2021-04-15 22:40:55程序输入的时候都设有一个输入缓冲区,每次输入,当键盘输入结束时会将输入的数据存入输入缓冲区,而cin直接从输入缓冲区中取数据。正因为cin是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin会直接... -
c++清空缓冲区
2019-05-06 12:38:00cin.clear(); cin.ignore(numeric_limits<std::streamsize>::max(), '\n'); 转载于:https://www.cnblogs.com/love-DanDan/p/10818906.html -
C++的输入输出流的缓冲区问题
2018-03-30 16:40:44现在来讨论一下关于C++的输入输出流的缓冲区问题一般 C++ 我们使用输出流cout都会用到endl这个操纵符。是吧C++里有几个可以来控制缓冲区刷新的操纵符。endlflushendsunitbufnounitbuf 这几个操纵符是用来控制输出流... -
cin清空输入缓冲区以及解决无法输入问题
2019-04-15 23:21:48但如果第一次没有输入有效字符(比如输入ctrl+z,回车)或者第一个输入为非法字符,则程序陷入死循环,不停的输出提示信息,但是不允许用户再次输入。 原因: 如果第一次没有输入有效字符,以... -
C++学习笔记——缓冲区与刷缓冲区
2021-08-10 11:26:36IO设施通常将输入(或输出)数据保存在一个缓冲区,读写缓冲区的动作与程序中的动作是无关的。我们可以显示地刷新输出缓冲,以便强制将缓冲区中的数据写入输出设备。 默认情况下,读cin会刷新cout;程序非正常终止... -
c/c++ 缓冲输入和非缓冲输入
2021-05-26 01:19:42这样就可以在输入回车(将输入缓冲区清空,并发送到程序的输入队列中,供程序使用)之前,进行输入的修改。但是也支持非缓冲输入,不需要输入回车来将输入发送给程序,而是键盘的任何输入都直接发送到程序的输入队列中... -
c++stringstream缓冲区的清空
2020-06-09 10:05:01但是,随之而来的问题是,stringstream的清空并没有那么简单。 用clear的话,内存会不断增长。 在for循环中每次调用strStream.clear()是希望在每次使用完strStream之后清理strStream占用的资源,但stringstream的... -
浅谈c语言清空输入缓冲区的注意事项
2021-09-06 12:05:29所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存的缓冲区中,叫作“键盘输入缓冲区”,简称“输入缓冲区”或“输入流”。 我们来设计一个程序: 设置密码,将密码保存到一个数组里,保存成功或失败都...