Top.Mail.Ru
Ответы

Язык программирования СИ. scanf() функция

Почему когда я запускаю этот код:

#include <stdio.h>

int main () {
int a, b;
if (scanf("%d %d", &a, &b) == 2)
printf("%d %d", a, b);
else
printf("Что-то пошло не так");
return 0;
}
input: 1 1.5
output: 1 1

Почему scanf читает оба числа перед '.' и игнорирует «.5\n»? Как проверить, что последнее число не является числом с плавающей запятой и строка заканчивается?

Пробовал на ОС: MacOS/Linux
Компилятор: gcc

*Я просто хочу запустить что-то вроде приведенного выше кода.
Ввести это:
input: 1 1,5234 (некоторое число с плавающей запятой)

и получить это:
output: «Что-то пошло не так»

По дате
По рейтингу
Аватар пользователя
Новичок
11мес

Потому, что int - ЦЕЛОЕ число и "%d" - ввод ЦЕЛОГО числа.
В котором не может быть никакой "точки" или "запятой".

Хочешь вводить ВЕЩЕСТВЕННОЕ число - используй double и "%lf".

Аватар пользователя
Высший разум
11мес

double x;
scanf("%lf", &x); // читает тип double

float y;
scanf("%f", &x); // читает тип float

При чтении scanf считывает строку и сопоставляет её со спецификатором типа. Если очередной символ в потоке не соответствует спецификатору, то чтение прекращается. Для целого числа точка является таким символом. Спецификатор %d соответствует целому числу.

Аватар пользователя
Искусственный Интеллект
11мес

#include <stdio.h>
int main(){
int a,b; float fa,fb; scanf("%f %f",&fa,&fb);
a=fa; b=fb; if(a!=fa||b!=fb)printf("Что-то пошло не так");}

Аватар пользователя
Мудрец
11мес

Богомерзкий scanf это то, что вообще лучше не использовать для ввода в серьезных программах.
Если есть желание сделать нормальную обработку ошибок ввода, то надо сначала вводить строку а потом выполнять ее парсинг. В этом сильно помогут функции strtol, strtoul и т.п. из stdlib.h Пример реализации данного подхода можно посмотреть тут: https://otvet.mail.ru/question/236730786