Проблема, связанная с ключевым словом continue в цикле do while - PullRequest
0 голосов
/ 26 января 2019

Для проекта мне нужно попросить пользователя ввести два числа. Если первый ввод (строка) плохой, программа должна снова запросить строку. Если второй ввод плохой (соответствует), программа должна запросить снова.и для строки, и для совпадений.

Я пытался сделать цикл do while, но даже после нескольких попыток он не работает так, как я хочу.

У вас есть какие-нибудь подсказки, чтобы сделать этоцикл работает так, как задумано?

ask_number() - это функция, которая запрашивает число от stdin, она принимает подсказку в параметре и return число или 0, если строка не только числовая

check_line() и check_matches() проверка правильности ввода.

my_putstr() является явным.

gamestate содержит информацию для функций check_

int player_turn(gamestate_t *gamestate)
{
    int line = 0;
    int matches = 0;

    my_putstr("Your turn:\n");
    do {
        line = ask_number("Line: ");
        if (check_line(line, gamestate)) {
            matches = ask_number("Matches: ");
        }
        else {
            line = 0;
            continue;
        }
    } while (!check_matches(line, matches, gamestate));
    return (0);
}

Если вы ввели неправильный ввод для строки, выход из функции.
Однако, если вы введете хороший номер для строки, то неправильный номер для совпадений будет работать, как и предполагалось, в том числе, если вы введете неверный номер строки.

1 Ответ

0 голосов
/ 26 января 2019

Не думаю, что здесь понадобится ключевое слово continue. Вы можете просто иметь логическое значение, которое вначале инициализируется равным 0, а затем выходить из цикла только после того, как вы выполнили оба условия (т. Е. Вы получите действительный ввод для line и matches), установив логическое значение переменная к 1.

int player_turn(gamestate_t *gamestate)
{
    int line = 0;
    int matches = 0;
    int bFound = 0;      //boolean variable indicating whether both values have been found

    my_putstr("Your turn:\n");
    do {

        line = ask_number("Line: ");
        if (check_line(line, gamestate)) {
            matches = ask_number("Matches: ");

            if (check_matches(line, matches, gamestate)) {
                bFound = 1;     //both inputs were valid, so set boolean variable to true and break out of loop
            }
            else {
                line = 0;
            }
        }
    } while(!bFound);

    return 0;
}

Если вы посмотрите на приведенный выше код, если первый ввод не пройден, то ваша программа не будет запрашивать ввод для matches, а вместо этого предложит пользователю повторно ввести значение для line.

Если второй вход дает сбой, программа сбрасывает line на 0, и цикл затем перезапускается, чтобы снова ввести значение для line. Если оба значения верны, тогда установите bFound в 1 (ИСТИНА) и выйдите из цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...