2014-01-11 2 views
0

Я работаю над текстовой игрой и хочу, чтобы игрок выбирал одиночный или многопользовательский режим. У меня есть следующие проверки в моем коде:Почему мой cout печатает дважды?

cout << "Welcome to Hangman!\nIs this a [s]ingle or [m]ultiplayer game?\nGame mode: "; 

int type = cin.get(); 
cin.clear(); 

//While input isn't single character s or m (either case) 
while (type != 115 && type != 109 && type != 83 && type != 77) { 
    cout << endl << "Please try again.\nGame mode: "; 
    cin.clear(); 
    type = cin.get(); 
} 

Что происходит, если игрок дает неверный ввод «Пожалуйста, повторите попытку режима игры:» печатает в два раза, но если игрок просто попадает ввести печатает один раз. Я начинаю с C++ и читаю, что cin.clear() иногда исправляет эту проблему, но до сих пор ничего не работало.

+0

'type', вероятно, новый символ линии () в другое время. – Dialecticus

+2

'cin.clear()' только очищает флаги ошибок. По-прежнему существует '\ n' от нажатия ввода в потоке. – dyp

+1

Кроме того, почему бы вам не использовать символьные литералы для сравнения с типом? Например. 'type == 's'' – dyp

ответ

0

Вы должны позвонить cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); после cin.clear()

cout << "Welcome to Hangman!\nIs this a [s]ingle or [m]ultiplayer game?\nGame mode: "; 

int type = cin.get(); 
cin.clear(); 

//While input isn't single character s or m (either case) 
while (type != 115 && type != 109 && type != 83 && type != 77) { 
    cout << endl << "Please try again.\nGame mode: "; 
    cin.clear(); 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    type = cin.get(); 
} 

Edit: в качестве DYP упоминается в комментариях sync не гарантируется делать ничего полезного в этом случае (его поведение определяется реализацией), поэтому единственный портативный способ сбросить символов до новой строки

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