Почему внутри цикла scanf() с %d не ждет ввода пользователя, если ранее он получил недопустимый ввод?

Я использую цикл what scanf() returns when it gets what is expects or when it doesn't. What happens is it gets stuck in thewhile()`.

Насколько мне известно, test = scanf("%d", &testNum); возвращает 1, если получает число, и 0, если нет.

Мой код:

#include<stdio.h>

int main(void) {
    while (1) {
        int testNum = 0;
        int test;
        printf("enter input");
        test = scanf("%d", &testNum);
        printf("%d", test);
        if (test == 0) {
            printf("please enter a number");
            testNum = 0;
        }
        else {
            printf("%d", testNum);
        }
    }
    return(0);
}

person bubba    schedule 16.09.2016    source источник


Ответы (1)


Проблема здесь в том, что при обнаружении недопустимого ввода (например, символа) неправильный ввод не используется, он остается в буфере ввода.

Итак, в следующем цикле тот же неверный ввод снова считывается scanf().

Вам необходимо очистить буфер после определения неправильного ввода. Очень простой подход:

    if (test == 0) {
        printf("please enter a number");
        while (getchar() != '\n');  // clear the input buffer off invalid input
        testNum = 0;
    }

Тем не менее, либо инициализируйте test, либо удалите printf("%d", test);, поскольку test является автоматической переменной, если она не инициализирована явно, содержит неопределенное значение. Попытка использовать это может вызвать неопределенное поведение.

Тем не менее, просто чтобы быть придирчивым, return не является функцией, не делайте так, чтобы она выглядела как таковая. Это утверждение, так что return 0; намного приятнее для глаз и в любом случае гораздо менее запутанно.

person Sourav Ghosh    schedule 16.09.2016
comment
Обратите внимание, что while (getchar() != '\n'); — это бесконечный цикл по условию конца файла. - person chux - Reinstate Monica; 16.09.2016