Как очистить входной буфер в приложении c ++? - PullRequest
0 голосов
/ 14 августа 2011

Я создаю много простых консольных приложений на c ++, и одна проблема, с которой я сталкиваюсь, - это буфер ввода. Я пробовал cin.ignore и flush (), но, похоже, они не работают для меня.

Если у меня есть такой код:

cin >> char1;
cin >> char2; 

и я нажимаю: 1 (пробел) 2 (Ввод), всего одним вводом, 1 сохраняется в char1, а 2 сохраняется в char2.

Извините, если я немного запутался в том, что я спрашиваю. Я постараюсь изменить этот вопрос, если люди не понимают.

Ответы [ 5 ]

5 голосов
/ 14 августа 2011

Вы можете использовать getline , чтобы прочитать всю строку сразу, затем std :: string в , если вам нужен первый символ, или использовать 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' (0x31, если ASCII), а не значение 123. Не уверен, хотите ли вы этого или нет.Если это не то, что вам нужно, прочитайте переменную int и затем выполните правильное приведение.

4 голосов
/ 14 августа 2011

посмотрите это:

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

это будет читать и игнорировать все, пока '\ n' не проигнорирует одну строку

2 голосов
/ 14 августа 2011

Если вы просто хотите получить первый символ в строке, прочитайте всю строку, а затем разбейте ее на части:

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

Если вы хотите получить первый непробельный символ, используйте istringstream и захватите символ:

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

"C" способ сделать это в Linux требует 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'and char2 =' 2 '

1 голос
/ 03 ноября 2013
cin >> char1;

cin >> char2;

fflush(stdin);

, если пользователь вводит: aaaaa bbbbb ccccc

будет вводить aaaaa into char1

и поставить bbbbb into char2

остальное будет игнорироваться

1 голос
/ 14 августа 2011

Если вы работаете с cstdio, то:

rewind( stdin );

должен сделать работу. В противном случае, я думаю, что на ваш вопрос ответили в Как очистить буфер cin? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...