В другом выражении происходит сбой при вводе буквы для значения cin << int - PullRequest
1 голос
/ 09 июня 2010

Хорошо, у меня есть вопрос, я отказался от использования строк для выбора, поэтому теперь я использую целое число.Когда пользователь вводит число, игра прогрессирует.Если они вводят неправильный символ, он ДОЛЖЕН дать утверждение else, однако, если я введу букву или символ, система перейдет в эффект бесконечного цикла, а затем вылетит.Есть ли способ дать оператор else, даже если пользователь определяет тип переменной.

// action variable;
int c_action: 

if (c_action == 1){
    // enemy attack and user attack with added effect buffer. 
    ///////////////////////////////////////////////////////
    u_attack = userAttack(userAtk, weapons);
    enemyHP = enemyHP - u_attack;

    cout << " charging at the enemy you do " << u_attack << "damage" << endl;
    e_attack = enemyAttack(enemyAtk);
    userHP = userHP - e_attack;
    cout << "however he lashes back causing you to have " << userHP << "health left "  << endl << endl << endl << endl;
    //end of ATTACK ACTION
}else{
    cout << "invalid actions" << endl;
    goto ACTIONS;
}

Ответы [ 3 ]

3 голосов
/ 09 июня 2010

Проблема в том, что ваш cin захватывает символ и затем терпит неудачу, что оставляет символ во входном буфере.Вам нужно проверить, сработал ли cin:

if( cin >> k) { ... }

или

cin >>k;
if(!cin.fail()) { ... }

и, если это не удалось, очистить буфер и бит сбоя:

cin.clear(); // clears the fail bit
cin.ignore(numeric_limits<streamsize>::max()); // ignore all the characters currently in the stream

РЕДАКТИРОВАТЬ: numeric_limits находится в заголовочном файле ограничений, который вы включаете, как обычно:

#include <limits>
3 голосов
/ 09 июня 2010

Вы не показали, как вы читаете целое число.Но в целом вы хотите сделать что-то вроде этого:

int answer;
if (cin >> answer)
{
   // the user input a valid integer, process it
}
else
{
   // the user didn't enter a valid integer
   // now you probably want to consume the rest of the input until newline and
   // re-prompt the user
}
1 голос
/ 09 июня 2010

Ваша проблема не с оператором else, а с вашим вкладом. Если вы делаете что-то вроде

cin >> i;

и введите символ, состояние ошибки потока устанавливается, и любая последующая попытка чтения из потока завершится неудачей, если вы сначала не сбросите состояние ошибки.

Вместо этого вы должны прочитать строку и преобразовать содержимое строки в целое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...