В вашем примере fgets
будет считывать максимум 9 символов из входного потока и сохранять их в str
вместе с ограничителем 0. Это не будет пропускать ведущие пробелы. Он остановится, если увидит новую строку (которая будет сохранена в str
) или EOF до максимального количества символов.
fscanf
со спецификатором преобразования %s
пропустит любой начальный пробел, затем прочитает все непробельные символы, сохранив их в str
, за которым следует терминатор 0. Он прекратит чтение следующего символа пробела или EOF. Без явной ширины поля он будет читать столько непробельных символов, сколько в потоке, что может привести к переполнению целевого буфера.
Итак, представьте, что входной поток выглядит так: "\t abcdef\n<EOF>"
. Если вы используете fgets
для чтения, str
будет содержать "\t abcdef\n\0"
. Если вы использовали fscanf
, str
может содержать "abcdef\0"
(где \0
обозначает терминатор 0).