различное поведение функции scanf с разными спецификаторами формата

когда я использую scanf с %d или %f, он пропускает символы пробела. с другой стороны, при использовании с %c он считывает символы пробела. Может ли кто-нибудь объяснить, почему это происходит?

с %d или %f, как в приведенном ниже коде, он автоматически пропускает пробельные символы

#include<stdio.h>
void main(void)
{
int i;
scanf("%d ",&i);
}

если я прочитаю ввод следующим образом

#include<stdio.h>
void main(void)
{
char ch;
scanf(" %c ",&ch);
scanf(" %c",&ch);  /*or like this*/
}

он пропускает символы пробела. почему scanf показывает разное поведение с спецификаторами формата????


person chanzerre    schedule 26.08.2013    source источник
comment
Я не думаю, что это поможет. Описание спецификаторов формата и их модификаторов довольно подробное.   -  person WhozCraig    schedule 26.08.2013
comment
почему это происходит? - Потому что %c ищет любой символ.   -  person    schedule 26.08.2013
comment
Да, как '%c' найдет пробельный символ, если он всегда их пропускал? Ни в одном из ваших входных данных никогда не будет пробелов.   -  person Crowman    schedule 26.08.2013
comment
Обратите внимание, что вы можете пропустить начальные пробелы, используя пробел в строке формата, например " %c"; таким образом вы подберете первый непробельный символ.   -  person John Bode    schedule 26.08.2013


Ответы (1)


По сути, это потому, что символ пробела недопустим для %d или %f, поэтому они их пропустят.

Но пробел является допустимым символом, поэтому %c попытается его обработать.

C99 §7.19.6.2 Функция fscanf раздел 8

Входные пробельные символы (как указано функцией isspace) пропускаются, если спецификация не включает спецификатор [, c или n.

person Yu Hao    schedule 26.08.2013