cin.get () не работает должным образом

Возможный дубликат:
Программа не ждет CIN

Я написал следующий код:

#include <iostream>
using namespace std;

void search(int pre, int a, int b, int x) {
char c;
cout << "Is the number " << ((x == 2) ? b : a) << endl;
c = cin.get(); ////// this does not block
if (c == 'y') return;

else {
cout << "Is the number " << ((x == 2) ? b : a) << " closer to your number than " << pre;
c = cin.get();

if (c == 'y') {
search(a, a, (a + b) / 2, 2);
} //c=='y'
else search(a, (a + b) / 2, b, 1);
}
}

int main() {
int N;
cout << "Enter N? ";
cin >> N;

search(N, 1, N, 1);
return 0;
}

Не нужно беспокоиться, если вы не понимаете логику, потому что мой вопрос не об этом.

В функции поиска есть два cin.get (), где мне нужен пользователь для ввода символа. Моя проблема в том, что программа блокирует ввод только после второго cin.get ().

Например:

 Is the number 7  //program doesn't wait after this
Is the number 7 closer to your number than 8  //program blocks here for an input

Почему это так?

0

Решение

В вашем коде есть как минимум две проблемы. Во-первых, ты
оставляя символы в буфере после ввода N, Простейший
Решение состоит в том, чтобы просто добавить вызов std::cin.ignore( INT_MAX, '\n' );
после std::cin >> N;; лучшее решение (потому что это позволяет больше
проверка ошибок) будет использовать std::getline читать полный текст
линии, а затем разобрать его с помощью std::istringstream,

Вторая проблема заключается в том, что вы присваиваете результаты
std::cin.get() в char, std::cin.get() возвращает int,
который может быть EOF, И вы действительно хотите проверить, является ли это EOF
перед преобразованием int в char: вы не можете проверить, потому что после
либо какой-то легальный char будет сравниваться равным EOF (обычная char является
подписано) или char никогда не сравнится равным EOF (обычная char
без знака). Другая альтернатива — сделать что-то вроде:

if ( !std::cin.get( c ) ) {
//  EOF or error seen...
}

каждый раз, когда вы хотите прочитать char, (Это может быть лучше в вашем
случай, так как если вы читаете EOF, все дальнейшие звонки std::cin.get()
вернусь EOF.)

2

Другие решения

Других решений пока нет …