@max10110

Почему при вводе нечислового значения цикл работает бесконечно?

#include <stdio.h>

int main()
{
    float firstNum;
    while (scanf("%f", &firstNum) == 0) {
			printf("Enter a NUMBER: ");
	}

    return 0;
}

Нужно чтобы при вводе нечислового значения срабатывал цикл и заново запрашивал значение, но при вводе буквы цикл работает бесконечно и просто выводиться сообщение из printf без возможности повторного ввода даных. В чем проблема?
  • Вопрос задан
  • 406 просмотров
Решения вопроса 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В чем проблема?

В том, что данные читаемые scanf -- это поток. Если формат (в вашем случае %f) не может извлечь данные из потока, они остаются там.
Чтобы сбросить данные которые невозможно прочитать можно использовать scanf("%*[^\n]");:
while (scanf("%f", &firstNum) == 0) {
      printf("Enter a NUMBER: ");
      scanf("%*[^\n]");
  }


Эта конструкция читает текущую строку до символа конца строки в пустоту.
Ответ написан
Комментировать
15432
@15432
Системный программист ^_^
Если scanf не может считать значение, прежний ввод остаётся нетронутым. Необходимо при ошибке "очищать" ввод. Наиболее безопасный способ - getchar() в цикле до \n.
Ответ написан
Вам уже ответили правильно на вопрос, но замечу, что лучше построить вашу программу будет вот так:

#include <stdio.h>

int main()
{
    int scanf_res = 0;
    double firstNum;

    do
    {
        printf("Enter a NUMBER: ");
        fflush(stdin);
        scanf_res = scanf("%lf", & firstNum);
    }
    while (scanf_res == 0);

    printf("NUMBER = %f", firstNum);

    return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы