Лидирующие пробелы при использовании scanf () с "% c" - PullRequest
0 голосов
/ 09 октября 2019

Я прочитал, и все говорят, что нужно использовать " %c", когда вы сканируете одним символом, потому что в начале входного потока могут быть пробелы.

Хорошо, честно. Но работает ли это ТОЛЬКО для самого первого символа в указанном входном потоке? Что если я сейчас сканирую один символ в строке из множества смежных символов? (ex: abcdef)

Не будет ли " %c" в качестве спецификатора формата теперь портить это?

1 Ответ

3 голосов
/ 09 октября 2019

Когда вы говорите scanf("%d", &...) для чтения целого числа, оно фактически пропускает начальный пробел, затем читает целое число.

Когда вы говорите scanf("%f", &...) для чтения числа с плавающей запятой, оно фактически пропускает начальный пробел, затем читает число с плавающей точкой.

Когда вы говорите scanf("%s", ...) для чтения строки, он фактически пропускает начальный пробел, а затем читает строку.

Вы начинаете видеть шаблон? Ну, не надейтесь, потому что:

Когда вы говорите scanf("%c", &...) для чтения символа, не пропускает начальный пробел. Если есть пробелы в начале, первым из пробельных символов является символ, который читает %c.

Это странное исключение для %c имело смысл для людей, которые впервые разработали scanf, но оно былос тех пор, когда все это вы хотите прочитать, это не непробельный символ, вы должны использовать спецификатор формата " %c" с пробелом перед %. Это пространство соответствует нулю или нескольким пробельным символам, таким образом пропуская любой начальный пробел и гарантируя, что %c будет пытаться прочитать для вас непробельный символ.

И так как это все так запутанно, противоречиво и труднообъясните, иногда вы увидите более простое объяснение «Просто используйте начальный пробел перед %c всегда», потому что все, что кто-либо * когда-либо захочет прочитать, в любом случае являются символами без пробелов.

[*Под «кем угодно» я подразумеваю любого начинающего, пишущего начинающую программу на Си. Теоретически, где-то может быть эксперт, который хочет использовать %c для чтения пробельных символов. Но эксперты обычно не используют scanf для чего-либо.]

...