Как очистить буфер cin после чтения char

0

У меня есть одна проблема. Во-первых, мне нужно прочитать один символ из пользовательского ввода, после чего мне нужно прочитать целое число. Проблема в том, что если я введу более одного символа на первом цинке, он не запрашивает ввести целочисленное значение.
Вот фрагмент моего кода.
Есть ли функция сброса или очистки буфера cin.
Я новичок, извините, если вопрос глуп. Благодарю.

int *i = new int;
int *c = new char;
std::cin >> *c;
std::cin >> *i;
  • 0
    Это нормально быть новичком. Тем не менее, я настоятельно рекомендую вам получить книгу. И забудь о new , хотя бы еще на месяц.
Теги:
stream
istream

3 ответа

0
Лучший ответ

Ты спрашивал:

Есть ли функция сброса или очистки буфера cin.

Существует std::istream::ignore(). На данной ссылке есть пример кода, который показывает, как использовать эту функцию.

В вашем случае я вижу что-то вроде:

int i;
int c;
std::cin >> c;
std::cin >> i;

if (std::cin.bad()) {
   std::cin.clear(); // unset failbit
   std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input
   std::cin >> i;
}
0

Это одна из тех чрезвычайно простых проблем, которые никто не знает, как правильно это делать. Самый эффективный и эффективный способ сделать это - вызывать игнорирование с точным количеством символов во входном буфере.

cin.clear();                              //clear errors/bad flags on cin

cin.ignore(cin.rdbuf()->in_avail(), '\n');//precise amount of ignoring
cin.rdbuf()->in_avail() //returns the exact number of characters in the cin buffer.

Это лучший ответ по нескольким причинам:

Никаких clunky не включает. Никакой обработки гигантских чисел. Требуемые операции ближе к входному буфере (in_avail vs. numeric_limits). Согласованность в следующих входных операциях (не будет прочитываться мимо "разделителя (\n)" или оставить символы в буфере). Рекомендовано адвокатом c++, доктором Робертом Джонсоном.

  • 0
    Спасибо за редактирование, мистер Эриксон. Новое для форумов, не новое для кодирования, в любом случае, еще раз спасибо.
  • 0
    Это было бы очень аккуратно, если бы оно работало «как положено», но поскольку: in_avail реализован во многих библиотеках std, он просто вернет 0 , что, по-видимому, все еще соответствует реализации.
Показать ещё 1 комментарий
-2

Я не уверен, почему вы создаете указатели здесь. Я также не знаю, как вы не получаете ошибки компилятора, пытаясь выделить char для int*. Если вам нужно прочитать в int и char, выполните следующие действия:

int i;
char c;

std::cin >> i;
std::cin >> c;

Как и Zeta, рекомендованная в комментариях, звучит так, как будто вам, возможно, потребуется немного прочитать C++. Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню