scanf. Работа с числами

Есть такой код:

int a, b;
scanf("%d/%d", &a, &b);
print("%d/%d", a, b);

Не могу понять, почему в случае ввода 10/5 я получаю на выходе как и положено 10/5, а в случае ввода 10.3/5 получаю 10/32766. Что происходит, когда scanf встречает число типа float, но спецификатор формата у меня указан %d? Разве он не должен "отсекать" всю часть после запятой и переходить к поиску другого спецификатора, который указан в строке scanf("%d%d", &a, &b);?


Ответы (2 шт):

Автор решения: Антон

Функция scanf возвращает количество значений, которое ей удалось считать scanf

#include <stdio.h>

int main()
{
    int a, b;
    int scanf_result = scanf("%d/%d", &a, &b);
    printf("%d/%d\n", a, b);
    printf("scanf result: %d\n", scanf_result);
}

Иными словами в случае если вы подаете 10.3/5, то scanf вернет 1, что значит, что правильно удалось считать лишь переменную 'a', а в других лежит мусор

→ Ссылка
Автор решения: Генс

В вашем примере вся загвоздка в символе '/' который стоит у вас между спецификаторами %d. Уберите его и всё будет происходить так как вы хотите. scanf абсолютно безразличен к пробельному символу и к их количеству ставите ли вы '\n' после каждого числа или в конце разделив числа пробелами, но '/' он ждёт именно там где вы его указали. Вместо этого он получает точку и дальше происходит то что сказали тут до меня другие участники. Это же относится и к любым другим символам. Как указываете в scanf точно так же должно быть и введено. Для убедительности можно поэкспериментировать со следующим кодом:

    int x, y, z;
    z=scanf(" %d.%d",&x,&y);
    printf("%d.%d scanf=%d\n",x,y,z) ;
→ Ссылка