enum { N = 1001 };
char s[N] = "";
fgets( s, sizeof( s ), stdin );
fgets()
читает строку, пока не встретит новую строку \n
(не просто пробел (
) или табуляцию (\t
) или если число элементов для записи будет превышено.
s
распадается на указатель на массив char
s
. sizeof(s)
даст количество элементов в s
, по-видимому N
, что составляет 1001
. stdin
- стандартный поток ввода.
for ( const char *p = s; *p; )
{
p += strspn( p, delim );
int n = strcspn( p, delim );
if ( n ) printf( "%*.*s\n", n, n, p );
p += n;
}
p
- указатель на const char
, здесь s
, что означает s
, рассматриваемый как строка или иным образом любые элементы его нельзя изменить внутри for
l oop.
p
получить разыменованный, означает, что он будет оценен до фактического символа p
до. l oop продолжается до тех пор, пока p
не будет указывать на нулевой символ строки внутри s
.
const char *delim = " \t\n";
....
p += strspn( p, delim );
p
будет увеличиваться на количество символов пробела, как указано в строке, указывающей delim
до, до первого появления любых других (читаемых) символов в s
.
int n = strcspn( p, delim );
n
будет получить количество символов в s
, прочитанном до первого появления любых пробельных символов, как указано в строке, на которую указывает delim
.
if ( n ) printf( "%*.*s\n", n, n, p );
Если n
не равен нулю (означает если есть какое-либо количество непробельных символов, которые нужно напечатать перед следующим символом пробела), printf()
напечатает последовательность последовательных непробельных символов (фактическое слово), содержащуюся в s
, к которой p
указывает на. Если строка содержит несколько слов, то каждое слово будет напечатано отдельно в явной строке, выполненной в разных итерациях for
l oop.
Первый *
после %
указывает минимальное поле ширина (сколько символов должно быть напечатано), которая предоставляется n
. Если p
фактически указывает на последовательность символов, состоящую из меньшего числа элементов, чем n
, левый пробел будет заполнен пробелами.
.*
указывает точность (Сколько символов в последовательности символов указано на p
фактически напечатаны.
p += n;
p
будет увеличен на количество символов в s
, прочитанных до первого появления любого из символов пробела.
Условие l oop докажет, если *p
фактически указывает на \0
, что затем оценивается в 0
, и l oop остановится. Иначе оно повторяется в другой раз через l oop.