如何清除c++应用程序中的输入缓冲区

How can I clear the input buffer in a c++ application?

本文关键字:应用程序 输入 缓冲区 c++ 何清除 清除      更新时间:2023-10-16

我制作了很多简单的控制台c++应用程序,我面临的一个问题是输入缓冲区。我试过cin.ignore和flush((,但它们似乎对我不起作用。

如果我有这样的代码:

cin >> char1;
cin >> char2; 

然后按:1(空格(2(回车(,只需输入一次,1存储到char1,2存储到char2。

对不起,如果我问的问题有点含糊。如果人们不理解,我会尝试编辑这个问题。

您可以使用getline一次读取整行,如果需要第一个字符,则使用std::string at,如果需要一个数字,则使用isstringstream

char char1;
std::string input;
getline(std::cin, input);
if (!std::cin.good()) {
  // could not read a line from stdin, handle this condition
}
std::istringstream is(input);
is >> char1;
if (!is.good()) {
  // input was empty or started with whitespace, handle that
}

如果你经常这样做的话,把它封装在一个函数中。根据以上内容,如果直接点击回车键(未输入字符(,或者输入以空格开头的数据,则is将为!good(),因此char1而不是

或者,在检查cin仍然良好后,您可以简单地:

if (input.empty()) {
  // empty line entered, deal with this
}
char1 = input.at(0);

这样,如果字符串不是空的,那么char1将被设置为第一个char,如果是input,不管是什么(包括空白(。

注意:

is >> char1;

将只读取第一个字符,而不是第一个数字(与input.at()版本相同(。因此,如果输入是123 qze,则char1将接收'1'(如果ASCII,则为0x31(,而不是值123。不确定这是否是你想要的。如果不是您想要的,请读取int变量,然后进行适当的强制转换。

看这个:

int a,b;
cin>>a;
cin.ignore(INT_MAX,'n');
cin>>b;

这将读入并忽略所有内容,直到'\n'忽略单行

如果您只想从行中读取第一个字符,请读取整行,然后将其拆分:

std::string s;
std::cin >> s;
char1 = s[0]; // this reads the lead character

如果您想要第一个非空白字符,请使用istringstream并获取一个字符:

#include <sstream>
std::istringstream iss(s);
iss >> char1;

在linux上使用"C"方式需要termios,看起来像这样:

#include <termios.h>
struct termios t;
tcgetattr(0, &t); 
t.c_lflag &= ~ICANON; // unbuffered
tcsetattr(0, TCSANOW, &t); // make the change now
char1=getchar()
char2=getchar()

现在,如果您尝试键入"12",则char1='1'和char2='2'

如果您使用cstdio,则:

rewind( stdin );

应该做这项工作。否则,我想你的问题已经在"如何冲洗cin缓冲液?"中得到了回答?。

cin >> char1;
cin >> char2;
fflush(stdin);

如果用户输入:aaaaa bbbbb ccccc

它将输入aaaaa into char1

并放入bbbbb into char2

其余部分将被忽略

相关文章: