scanf () плохо себя ведет - PullRequest
       13

scanf () плохо себя ведет

0 голосов
/ 21 февраля 2011

У меня очень короткий фрагмент, который читается целым числом:

#include <stdio.h>

int main() {
    while (1) {
        int i = 0;
        int r = scanf("%d", &i);

        if (r == EOF) {
            printf("Error using scanf()\n");
        } else if (r == 0) {
            printf("No number found\n");
        } else {
            printf("The number you typed in was %d\n", i);
        }
    }
}

но проблема в том, что если я ввожу какую-либо букву, она просто повторяет цикл и печатает «Номер не найден» вместо ожидания следующего ввода.

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

При использовании scanf, если вы пытаетесь выполнить операцию чтения, и найденные данные не соответствуют ожидаемому формату, scanf оставляет неизвестные данные для последующего чтения в следующей операции чтения.В этом случае происходит то, что вы пытаетесь прочитать отформатированные данные от пользователя, данные пользователя не соответствуют ожидаемому формату, и поэтому они ничего не могут прочитать.Затем он циклически повторяется, чтобы попытаться прочитать снова, и находит те же самые вводные данные, которые у него были раньше, затем повторяется снова и т. Д.

Чтобы это исправить, вам просто нужно использовать символы, которые склеивали ввод.Один из способов сделать это - вызвать fgetc для чтения символов, пока не будет обнаружена новая строка, которая сбросит все оскорбительные символы:

while (1) {
    int i = 0;
    int r = scanf("%d", &i);

    if (r == EOF) {
        printf("Error using scanf()\n");
    } else if (r == 0) {
        printf("No number found\n");

        /* Consume bad input. */
        while (fgetc(stdin) != '\n')
            ;

    } else {
        printf("The number you typed in was %d\n", i);
    }
}

Надеюсь, это поможет!

1 голос
/ 21 февраля 2011

Звучит так, будто вы не очищаете входной буфер и не сканируете неправильный символ снова и снова.
Смотрите здесь:
Scanf и петли
и
scanf не завершается

0 голосов
/ 21 февраля 2011

На странице руководства написано

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ Эти функции возвращают количество назначенных элементов ввода. Это может быть меньше, чем предусмотрено, или даже ноль, в событие совпадающего сбоя. Ноль означает, что, хотя вход был доступен, преобразования не были назначены; typ- это связано с неправильным вводимым символом, таким как буквенный символ для преобразования `% d '.

Поскольку вы использовали "% d", если вы используете любое число, это будет работать нормально, иначе оно не будет использовать его из буфера

...