У меня есть одна проблема. Во-первых, мне нужно прочитать один символ из пользовательского ввода, после чего мне нужно прочитать целое число. Проблема в том, что если я введу более одного символа на первом цинке, он не запрашивает ввести целочисленное значение.
Вот фрагмент моего кода.
Есть ли функция сброса или очистки буфера cin.
Я новичок, извините, если вопрос глуп. Благодарю.
int *i = new int;
int *c = new char;
std::cin >> *c;
std::cin >> *i;
Ты спрашивал:
Есть ли функция сброса или очистки буфера 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;
}
Это одна из тех чрезвычайно простых проблем, которые никто не знает, как правильно это делать. Самый эффективный и эффективный способ сделать это - вызывать игнорирование с точным количеством символов во входном буфере.
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++, доктором Робертом Джонсоном.
in_avail
реализован во многих библиотеках std, он просто вернет 0
, что, по-видимому, все еще соответствует реализации.
Я не уверен, почему вы создаете указатели здесь. Я также не знаю, как вы не получаете ошибки компилятора, пытаясь выделить char
для int*
. Если вам нужно прочитать в int и char, выполните следующие действия:
int i;
char c;
std::cin >> i;
std::cin >> c;
Как и Zeta, рекомендованная в комментариях, звучит так, как будто вам, возможно, потребуется немного прочитать C++. Надеюсь это поможет.
new
, хотя бы еще на месяц.