Когда вы говорите scanf("%d", &...)
для чтения целого числа, оно фактически пропускает начальный пробел, затем читает целое число.
Когда вы говорите scanf("%f", &...)
для чтения числа с плавающей запятой, оно фактически пропускает начальный пробел, затем читает число с плавающей точкой.
Когда вы говорите scanf("%s", ...)
для чтения строки, он фактически пропускает начальный пробел, а затем читает строку.
Вы начинаете видеть шаблон? Ну, не надейтесь, потому что:
Когда вы говорите scanf("%c", &...)
для чтения символа, не пропускает начальный пробел. Если есть пробелы в начале, первым из пробельных символов является символ, который читает %c
.
Это странное исключение для %c
имело смысл для людей, которые впервые разработали scanf
, но оно былос тех пор, когда все это вы хотите прочитать, это не непробельный символ, вы должны использовать спецификатор формата " %c"
с пробелом перед %
. Это пространство соответствует нулю или нескольким пробельным символам, таким образом пропуская любой начальный пробел и гарантируя, что %c
будет пытаться прочитать для вас непробельный символ.
И так как это все так запутанно, противоречиво и труднообъясните, иногда вы увидите более простое объяснение «Просто используйте начальный пробел перед %c
всегда», потому что все, что кто-либо * когда-либо захочет прочитать, в любом случае являются символами без пробелов.
[*Под «кем угодно» я подразумеваю любого начинающего, пишущего начинающую программу на Си. Теоретически, где-то может быть эксперт, который хочет использовать %c
для чтения пробельных символов. Но эксперты обычно не используют scanf
для чего-либо.]