Я только что запустил ваш код, и когда вы нажмете клавишу ввода, он будет ждать, пока вы не введете число или что-то недопустимое, например символ или строку.Я обнаружил, что если вы измените свой код с
cin >> room_change;
на
cin >> noskipws >> room_change;
, когда пользователь введет пробел, это приведет к тому, что cin.fail () вернет true, а затемперейдите к печати «Выберите существующую комнату».
В вашей ситуации цикл while будет вызываться до тех пор, пока мы не получим действительный ввод.«Выбрать существующую комнату» действительно повторяется, потому что room_change является целым числом, поэтому, когда мы нажимаем Enter, в буфере остается «\ n».Затем цикл while на следующей итерации читает это '\ n' и выполняет cin.fail (), прежде чем позволить вам ввести что-то еще.Одно решение, которое я нашел, состоит в том, чтобы использовать больше операторов cin.ignore ().
for (bool check = false; check == false;) { // Check if input is invalid
cin >> noskipws >> room_change;
if (cin.fail()) {
cout << "Choose an existing room.";
cin.clear();
cin.ignore();
} else if (room_change == room_current) {
cout << "You're already in that room.";
cin.ignore();
} else {
check = true;
cin.ignore();
}
}
Причина в том, что мы хотим избавиться от этого '\ n', чтобы cin.fail () не выполнялся.Тем не менее, я обнаружил, что когда вы вводите символ, он напечатает «Выберите существующую комнату» дважды.Он будет напечатан в первый раз, потому что символ не является целым числом, а во второй раз из-за этого '\ n'.