Оператор Else аварийно завершает работу, когда я ввожу букву для значения cin ‹< int

Хорошо, у меня есть вопрос, я отказался от использования строк для выбора, поэтому теперь я использую целое число. Когда пользователь вводит число, игра продолжается. Если они вводят неправильный символ, он ДОЛЖЕН дать инструкцию 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;
}

person Community    schedule 08.06.2010    source источник
comment
Вы не показали строку, которая читает ввод от пользователя.   -  person Brian Neal    schedule 09.06.2010
comment
Я полагаю, что «goto ACTIONS» можно заменить правильным вызовом функции.   -  person Hernán    schedule 09.06.2010
comment
не могли бы вы что-нибудь сделать с форматированием? это так ужасно, что я не собираюсь беспокоиться. Кроме того, я вижу еще, но нет «если».   -  person Edward Strange    schedule 09.06.2010
comment
Похоже, трое из нас исправили макет кода одновременно, лол. Мои глаза кровоточили.   -  person Dan McGrath    schedule 09.06.2010
comment
goto ACTIONS;// I know a potential employer! stackoverflow.com/questions/ 2910017 /   -  person Dan McGrath    schedule 09.06.2010
comment
Учиться на практике - это нормально, если вы делаете правильные вещи. Тот факт, что в C ++ есть оператор goto, не означает, что вы должны его использовать.   -  person Cogwheel    schedule 09.06.2010
comment
О, вот и мы; еще одна goto война.   -  person dreamlax    schedule 09.06.2010


Ответы (3)


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

cin >> i;

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

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

person Axel    schedule 08.06.2010
comment
Спасибо, отличная идея, я учу себя C ++, поэтому у меня масса вопросов. - person TimothyTech; 09.06.2010
comment
@ Тимоти: Не для того, чтобы убивать радость, но ты просто навредишь себе этим знанием. Возьмите хорошую книгу. stackoverflow.com/questions/388242 / - person GManNickG; 09.06.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
}
person Brian Neal    schedule 08.06.2010
comment
В частности, что-то вроде cin.clear (); cin.ignore (numeric_limits ‹streamsize› :: max (), '\ n'); - person user168715; 09.06.2010

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

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

or

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>
person Niki Yoshiuchi    schedule 08.06.2010
comment
Должно быть, я получаю неправильный код или что-то в этом роде, потому что я не вижу ни единого использования cin в коде OP. - person Edward Strange; 09.06.2010
comment
@Noah Roberts: Он упомянул, что бесконечный цикл вызывается тем, что пользователь вводит символ вместо числа. Я также прокомментировал предыдущий вопрос, который он задал о cin, поэтому решил, что это продолжение. - person Niki Yoshiuchi; 09.06.2010