Как написать ввод функцию, которая будет проверять на валидность значения на языке C с некоторым условием?

Я пытался написать ввод функцию в виде:

static int correctInput(int* digit) {
    char c;
    while (scanf("%d%c", digit, &c) != 2 || c != '\n' || *digit < 2 || *digit > 10) {
        printf("Некорректный ввод! Введите число (от 2 до 10 ): ");

        while (getchar() != '\n') {}
    }
}

Но после ввода значения, который не подходит под условие 2 <= base <= 10 дважды, то код ждет дополнительного Enter, так как:

while (getchar() != '\n') {} забирает перенос строки с собой ( ну это я так понял, возможно ошибаюсь )

Я решил эту проблему так:

static int correctBase(int* choice) {
    char c;

    while (1) {
        c = getchar();
        if (c == '\n') continue;

        if (c >= '2' && c <= '9') {
            *choice = c - '0';
            while (c != '\n') c = getchar();
            return 0;
        }

        while (c != '\n') c = getchar();
        printf("Некорректный ввод! Введите число от 2 до 10: ");
    }
}

Думал, ура, получилось, а потом я решил написать мини задачу, которая будет конвертировать из 10 СС в любую другую СС до 16 СС. Как сделать корректную функцию ввод проверку, для такого случая?


Ответы (2 шт):

Автор решения: MENTOL

Помог с решением данной дилеммы очень умный и хороший друг.

int GetNumberFromUser() {
int userInput;
int scanResult;
char nextChar;

do {
    printf("Введите число ( от 2 до 16 ): ");
    scanResult = scanf("%d", &userInput);
    
    if (scanResult != 1) {
        printf("Некорректный ввод! Введите число (от 2 до 16).\n");
        while (getchar() != '\n');
        userInput = 0;
    } else {
        nextChar = getchar();
        if (nextChar != '\n' && nextChar != ' ' && nextChar != '\t') {
            printf("Некорректный ввод! Введите число (от 2 до 16).\n");
            while (nextChar != '\n') {
                nextChar = getchar();
            }
            userInput = 0;
            } else if (userInput < 2 || userInput > 16) {
                printf("Некорректный ввод! Введите число (от 2 до 16).\n");
            }
        }
    } while (scanResult != 1 || userInput < 2 || userInput > 16);

    return userInput;
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

skip_line пропускает ввод до ближайшего конца строки. Возвращает истину, если в строке были только пробельные символы:

bool skip_line() {
    bool spaces_only = true;
    while (true) {
        int c = getchar();
        if (c == EOF) {
            return false;
        }
        if (c == '\n') {
            return spaces_only;
        }
        if (!isspace(c)) {
            spaces_only = false;
        }
    }
}

input_range вводит число в указанном диапазоне. Число должно быть единственным на строке. Допускаются пробелы до и после числа. Если введено не число или число вне диапазона, программа сообщает об ошибке и повторяет ввод.

int input_range(int min, int max) {
    while (true) {
        printf("Введите число от %d до %d: ", min, max);
        int n;
        if (scanf("%d", &n) == 1) {
            if (skip_line() && min <= n && n <= max) {
                return n;
            }
        } else {
            skip_line();
        }
        puts("Некорректный ввод!");
    }
}
→ Ссылка