@Nulltiton

Почему scanf считывает значение только первой переменной?

В приложении есть проверка на ввод только целых чисел:
while (scanf("%f %f %f", &a, &b, &c) != 1 || a - (int)a != 0 || b - (int)b != 0 || c - (int)c != 0)
{
    fflush(stdin);
    printf("Ошибка. Введите снова: ");
}


При вводе 1.0 2.0 3.0 переменная a = 1.00000000, b и c = 0.00000000
Однако если сначала ввести 1 2 3, то приложение выведет "Ошибка. Введите снова: ", а при повторном вводе 1.0 2.0 3.0 значения получат все три переменные. Почему так происходит и как это исправить?
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Если вам нужен ввод целых чисел, то читайте их в целые переменные через %d. Еще, scanf возвращает количество прочитанных значений. Т.е. сравнивать надо с тройкой, а не единицей.

Еще одна проблема: возможно, из-за настроек локализации, оно ждет десятичные запятые, а не точки. Попробуйте ввести "1,0 2,0 3,0" или "1 2 3".

И вообще весь ваш сценарий - это комбинация ошибок в пером и втором абзаце. Из за точек вместо запятых оно читает только первую переменную сначала, видит, что ввело 1 переменную и завершает цикл. При вооде "1 2 3" оно читает все переменные, но из-за ошибки в проверке (вы же хотите, чтобы одна прочиталась) читает опять. При повтороном вводе "1.0 2.0 3.0" оно читает только первую переменную и завершается. При этом в b и c остались значения от прошлого ввода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
while (scanf("%f %f %f", &a, &b, &c) != 1 || ...

В приведённом коде нет определений a, b и c. Они должны иметь тип float, чтобы формат %f scanf работал правильно.

если сначала ввести 1 2 3, то приложение выведет "Ошибка. Введите снова: "
как это исправить?

scanf возвращает число успешно отсканированных полей, возвращаемое scanf значение надо сравнивать с 3 в условии цикла.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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