2014-12-02 3 views
0

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

int *i = new int; 
int *c = new char; 
std::cin >> *c; 
std::cin >> *i; 
+0

Это нормально быть новичком. Однако я ___strongly___ рекомендую вам получить книгу. И забудьте о «новом», по крайней мере, еще месяц. – Zeta

ответ

0

Вы спросили:

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

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; 
} 
-1

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

int i; 
char c; 

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

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

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. 

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

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

+0

Благодарим за редактирование г-на Эриксона. Новое на форумах, не новое для кодирования, в любом случае еще раз спасибо. – djg

+0

Это было бы очень аккуратно, если бы оно работало «как ожидалось», но поскольку: 'in_avail' реализован во многих библиотеках std, он просто вернет' 0', что, по-видимому, все еще соответствует реализации. –

+0

Причина в том, что rdbuff() - это метод доступа к члену streambuf * cin, который является объектом istream. Вы ничего не читали, но in_avail() возвращает ноль, когда вы его вызываете. – djg

Смежные вопросы