Способ определения числа, а не буквы из строки. (в настоящее время используется istringstream)

Я сделал простую игровую программу, и требование требует, чтобы игрок мог отменить несколько ходов (отменить n).

Я прошу пользователя ввести команду (отменить n), и он берет заднюю половину и помещает ее в int. По сути, я хочу, чтобы программа останавливала пользователя, если он ввел что-либо, кроме числа. Поэтому, если пользователь набрал undo f, он не преобразует f в числовую форму (по крайней мере, я так думаю), но вызовет ошибку. Я искал некоторое время и не мог найти ничего, что работало или имело смысл для меня.

try {
   int undo;
   istringstream is(userInput.substr(5, userInput.length()));
   is >> undo;

   for (int numOfUndos = undo; numOfUndos > 0; numOfUndos--) {
      board.UndoLastMove();
   }
   moveValidated = true;
}
catch (exception &e) {
   cout << "/-----------------------------/" << endl;
   cout << e.what() << endl;
   cout << "/-----------------------------/" << endl;
}

Если возможно, я хотел бы просто использовать то, что у меня есть сейчас, или с cin. Кроме того, простите меня, но я все еще изучаю С++ и не знаю многих продвинутых методов, поэтому, если есть сложный способ сделать это, простите меня, если мне потребуется немного времени, чтобы понять.

Спасибо за любую помощь заранее.


person Thomas Brooks    schedule 16.11.2014    source источник
comment
Описание игры на самом деле не имеет отношения к вашей проблеме: как преобразовать строку в целое число и проверить, не получилось ли это. Для этого if (is >> undo) { worked } else { failed } Выдает ли UndoLastMove исключение?   -  person Neil Kirk    schedule 17.11.2014
comment
К вашему сведению: если ввод не представлял собой целое число (например, буквенные символы), то в undo ничего не извлекается. undo сохранит свое неинициализированное значение, а затем будет запущен цикл for с использованием этого значения, что является неопределенным поведением. Вот почему вы должны проверять свой ввод с помощью условного оператора, как показывает Нил Кирк.   -  person 0x499602D2    schedule 17.11.2014
comment
Да, я видел это где-то еще, но, к сожалению, оставил в операторе is >> undo; перед добавленным условным оператором. Я реализовал это, и это сработало. Спасибо.   -  person Thomas Brooks    schedule 17.11.2014


Ответы (1)


Это сработало для меня. Спасибо еще раз.

Описание игры на самом деле не имеет отношения к вашей проблеме: как преобразовать строку в целое число и проверить, не получилось ли это. Для этого if (is >> undo) {сработало} else {сбой} Выдает ли UndoLastMove исключение? — Нил Кирк

person Thomas Brooks    schedule 17.11.2014