Do-while пропускается или если оператор не работает - PullRequest
1 голос
/ 26 марта 2019

После однократного выполнения двух функций цикл do while продолжает переходить к условию while и переходит прямо к функции getInt, которая затем застревает в scanf("%d,%c", &Value, &NL) до символа (или слова, подобного офису).) вводится.Это будет происходить еще 3 раза, пока не появится четвертое сообщение «Недопустимый INTEGER», которое будет отображаться в сообщении «OUT OF RANGE», только для того, чтобы процесс who повторился снова.Не уверен, что цикл do-while не работает или if statements не работает.

При тестировании функции (ей) со словом (то есть офисом) он getInt объявитзначения «недействительный INTEGER», и при тестировании со значениями 99 или 501 getIntInRange должен объявить значение «OUT OF RANGE», однако функция getIntInRange будет показывать сообщение «OUT OF RANGE» только после 5 итераций(при чередовании значения и символа сообщение «OUT OF RANGE» будет отображаться после четвертой попытки ввода значения

// getInt function definition goes here:
int getInt(void) {
    int Value = 0;
    char NL = "";

    do {
        scanf("%d%c", &Value, &NL);
        if (NL != '\n') {
            clearKeyboard();
            printf("*** INVALID INTEGER *** <Please enter an integer>: ");
        } else {
        };
    } while (NL != '\n');

    return Value;
}

// getIntInRange function definition goes here:
int getIntInRange(int lowerBound, int upperBound) {
    do {
        //getInt();
        if (getInt() < lowerBound | getInt() > upperBound) {
            printf("*** OUT OF RANGE *** <Enter a number between %d and %d>: ", lowerBound, upperBound);
        } else {
            continue;
        };
    } while (getInt() < lowerBound | getInt() > upperBound);

    return getInt();
}

Моя функция getIntInRange предполагает получение значения от getInt function (getInt проверяет, является ли введенное значение целым числом) и сравнивает значения с lowerBound (установленным как 100 в другом исходном коде) и upperBound (установленным как 500 в другом исходном коде).вне диапазона, тогда будет отображаться сообщение об ошибке.

1 Ответ

1 голос
/ 26 марта 2019

Ваш код содержит несколько ошибок:

  • char NL = ""; неверно: char является символом, "" является строкой.
  • scanf("%d%c", &Value, &NL); не является способом надежной проверки правильности ввода, вместо этого следует проверить возвращаемое значение scanf(): if (scanf("%d", &Value) != 1) { /* invalid input */ }
  • Вы не должны вызывать getInt() несколько раз, значение должно быть сохранено в переменной, и переменная должна быть проверена, в противном случае ввод значения будет потерян.
  • Вы должны использовать неправильный ввод перед повторным вызовом scanf().
  • Вы должны проверить конец файла, чтобы избежать бесконечного цикла.
  • вы должны использовать || или && для логических тестов, | для битовых манипуляций.
  • избегайте do / while циклов, они, как известно, сбивают с толку и склонны к ошибкам программирования.

Вот исправленная версия:

#include <stdio.h>
#include <stdlib.h>

int clearInput(void) {
    int c;
    while ((c = getchar() != EOF && c != '\n')
        continue;
    return c;
}

int getInt(void) {
    int value = 0;

    while (scanf("%d", &value) != 1) {
         if (clearInput() == EOF) {
             printf("unexpected end of file\n");
             exit(1);
         }
         printf("not an integer, try again\n");
    }
    return value;
}

int getIntInRange(int lowerBound, int upperBound) {
    for (;;) {
        int value = getInt();
        if (value >= lowerBound && value <= upperBound)
            return value;
        printf("*** OUT OF RANGE *** <Enter a number between %d and %d>: ", lowerBound, upperBound);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...