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

时间:2011-08-14 05:21:29

标签: c++ input

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

如果我有以下代码:

cin >> char1;
cin >> char2; 

我按下:1(空格)2(回车),只有一个输入,1存储到char1,2存储到char2。

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

5 个答案:

答案 0 :(得分:5)

您可以使用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 if input,无论是什么(包括空格)。

请注意:

is >> char1;

只会读取第一个字符,而不是第一个字符(与input.at()版本相同)。因此,如果输入为123 qzechar1将收到'1'(如果是ASCII,则为0x31),而不是值123.不确定这是否是您想要的。如果它不是您想要的,请阅读int变量,然后正确投射。

答案 1 :(得分:4)

看看这个:

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

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

答案 2 :(得分:2)

如果您只想要该行中的第一个字符,请阅读整行,然后将其拆分:

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'

答案 3 :(得分:1)

如果你正在使用cstdio,那么:

rewind( stdin );

应该做的工作。否则,我认为您的问题已在How do I flush the cin buffer?中得到解答。

答案 4 :(得分:1)

cin >> char1;

cin >> char2;

fflush(stdin);

如果用户输入:aaaaa bbbbb ccccc

它会输入aaaaa into char1

并放置bbbbb into char2

其余的将被忽略