Прежде всего, прямое использование std::cin >> PlayerChoice;
обычно не является предпочтительным.Он не проверяет ошибки ввода пользователя.Вместо этого рекомендуется использовать std::cin.getline()
плюс проверка синтаксиса всей строки.Например, если пользователь вводит «2 3 1 5 4», «2» активирует ваш вариант 2, но все остальные входы буферизуются.После этого ваш следующий std::cin
для целого числа получит «3», не спрашивая пользователя снова.
Мне странно, что вы получили результаты, но я пытаюсь объяснить это:
Когда был введен ввод 7.4, так как ваша программа инструктирует его о получении целого числа, вводится 7
. И, таким образом, он печатает ваше сообщение об ошибке «неправильный ввод ...». Но в следующем цикле ваш std::cin.ignore()
не очищает буфер (вот почему я не знаю, почему. Он должен, согласно std::cin.ignored()
руководству.) Тогда "." игнорируется, так как это не число, а "4" входит.Он запускает опцию «4» для завершения программы.
Фактически, если вы измените std::cin.ignore()
на std::cin.ignore('\n')
, это сработает.
ОБНОВЛЕНИЕ: Теперь я знаю, почему ваш std::cin.ignore()
не выполняет работу: согласно руководству, если не указан первый аргумент, например n
, n = 1
. Таким образом, вы просто проигнорировали 1 байт. Пожалуйста, прочитайте std::basic_istream::ignore
manual.