Некоторые действительно странные ошибки случаются при выполнении цикла while - PullRequest
0 голосов
/ 10 декабря 2018

Итак, я пишу консольную игру Sea Battle.Я на самом деле писал функцию для игрового меню.Когда все выполняется, все работает отлично, за исключением некоторых странных глюков.

  • Когда я ввожу недопустимое значение float , которое содержит числа от 1 до 4 в качестве значения и (например, 7.4), оно отображает стандартное сообщение об ошибке, но затем также выполняеткоманды, соответствующие этому номеру (7.4 вызовет сообщение об ошибке, но затем через некоторое время выйдет из программы, как если бы пользователь ввел число «4» в качестве ввода, то же самое относится и к любому числу x. [1-4])
  • Еще один странный, но довольно безобидный сбой происходит, когда пользователь вводит в качестве ввода несколько недопустимых символов неправильного типа.Например, если пользователь вводит «!!!!!!», консоль будет отображать сообщение об ошибке 6 раз, прежде чем запрашивать другой ввод.

Вот фрагмент кода, в котором возникают проблемы.Случаи с 1 по 3 не закончены, поэтому они пока не заполнены.

std::cout << "Press a corresponding number for each action you want to do.\n\n1. Play Game\n2. Instructions\n3. Options\n4. Exit\n\n";
short int PlayerChoice;
std::cin >> PlayerChoice;
while (PlayerChoice != 1 && PlayerChoice != 2 && PlayerChoice != 3 && PlayerChoice != 4) // In case the user will enter the invalid/incorrect input or number
{ 
    std::cin.clear();
    std::cin.ignore(); // Prevents infinite loop from happening if user enters a char value
    std::cout << "Wrong input, please input a correct number between 1 and 4 (inclusive)\n";
    std::cin >> PlayerChoice;
}
switch (PlayerChoice){
case 1:
    Sleep(850);

    break;
case 2:
    Sleep(850);

    break;
case 3:
    Sleep(850);

    break;
case 4:
    Sleep(850);
    std::cout << "You have decided to exit the game.\n";
    Sleep(1500);
    std::cout << "Thanks for playing and hope to see you soon!";
    Sleep(3000);
    exit(0);
    break;
default: // This section actually isn't supposed to be executed under any circumstances
    std::cout << "Unexpected error occured. Terminating the programme.";
    break;
    }

Просто, чтобы прояснить ситуацию, вот скриншот того, что я имею в виду .

Я относительно новичок в C ++, поэтому любой специалист по C ++ может объяснить природу этих ошибок и дать мне несколько советов, как я могу это исправить?Большое спасибо заранее!

1 Ответ

0 голосов
/ 10 декабря 2018

Прежде всего, прямое использование 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.

...