C/C++ 四种清空输入缓冲区的方法
一、
fflush(stdin);
C语言:清空输入缓冲区的所有内容,在VS中没有效果
二、
cin.sync();
C++:清除输入缓冲区的所有内容,在VS中没有效果
三、
cin.ignore(std::numeric_limits< streamsize >::max(), ‘ ’);
C++:清除输入缓冲区的所有内容,直到遇到回车符为止, 各种编译器都有效
简要说明: cin.ignore(count, c); 从输入流中提取并丢弃字符,直到遇到下列三种情况 1.提取的字符达到了参数count指定的数量 2.在输入序列中遇到文件结束(EOF) 3.输入序列中的下一个字符为参数c指定的字符(这个字符会被提取并丢弃) 可以写成: cin.ignore(10, ‘ ’); 提取输入缓冲区中的数据,直到遇到回车符,当读取的数据到达十个时,就会停止提取,不会继续提取到回车符。(限制提取十个数据)
count常常取: std::numeric_limits< std::streamsize >::max() 相当于IO流的最大字符个数
常见用法:(把标准输入缓冲区cin的所有数据都清空) cin.ignore(std::numeric_limits< streamsize >::max(), ‘ ’);
注意: 1.cin.ignore(std::numeric_limits< streamsize >::max(), ‘ ’);在有包含头文件#include <Windows.h>时是无法使用的;
2.因为该头文件已经包含了宏定义min 和 max,再使用就会优先调用头文件#include<Windows.h>中的宏定义,就会起冲突,从而导致报错;
3.如果有要求要包含头文件#include <Windows.h>,而且还要使用cin.ignore(std::numeric_limits< streamsize >::max(), ‘ ’);的话,需要在包含头文件#include<Windows.h>之前加上一句#define NOMINMAX,限定头文件#include<Window.h>中的宏定义min 和 max 就行了;
4.或者直接删去头文件#include<Windows.h>也可以解决问题
5》》》》》》》》》》》》》》》》》》》》》》》》》》》》 还有一种解决方法: cin.ignore((std::numeric_limits< streamsize >::max)(), ‘ ’); 在回车符前面加上一个括号就可以了,因为不加()的话,max 就和系统中已经有的,预定义的max宏函数混淆了。
四、
char c; while ((c = getchar()) != ‘ ’);
C/C++:循环读取输入缓冲区的数据,直到遇到回车符为止,效果等效于:清空输入缓冲区的所有数据,直到遇到回车符为止。 在各种编译器中有效。
