我制作了很多简单的控制台c ++应用程序,我面临的一个问题是输入缓冲区。我尝试过cin.ignore和flush(),但它们似乎对我没用。
如果我有以下代码:
cin >> char1;
cin >> char2;
我按下:1(空格)2(回车),只有一个输入,1存储到char1,2存储到char2。
对不起,如果我对我的要求有点模糊。如果人们不理解,我会尝试编辑这个问题。
答案 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 qze
,char1
将收到'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)
答案 4 :(得分:1)
cin >> char1;
cin >> char2;
fflush(stdin);
如果用户输入:aaaaa bbbbb ccccc
它会输入aaaaa into char1
并放置bbbbb into char2
其余的将被忽略