Поведение ведущих нулей по умолчанию с ISO C99 printf (% Nd)?

Я только что заметил следующее в стандарте ISO C99, 7.19.6.1 The fprintf function, подраздел 6, в котором подробно описываются флаги преобразования, в частности флаг 0:

0: преобразования d, i, o, u, x, X, a, A, e, E, f, F, g и G, ведущие нули (после любого указания знака или основания) используются для заполнения по ширине поля, а не для заполнения пробелами, за исключением случаев преобразования бесконечности или NaN.

Пока все хорошо, я знаю, что следующие строки дадут показанный вывод:

printf ("%5d\n", 7);   // produces "    7"
printf ("%05d\n",7);   // produces "00007"

Однако в подразделе 8 с подробным описанием модификаторов преобразования я вижу:

d,i: Аргумент int преобразуется в десятичное число со знаком в стиле [−]dddd. Точность определяет минимальное количество отображаемых цифр; если преобразуемое значение может быть представлено меньшим количеством цифр, оно дополняется ведущими нулями.

Это явно не так, поскольку поведение по умолчанию заключается в дополнении пробелами, а не нулями. Или я что-то не так читаю здесь?


person paxdiablo    schedule 30.01.2012    source источник


Ответы (1)


Вы путаете точность и ширину поля:

printf("%.5i",  1);  // prints "00001", precision = 5
printf("%5i",   1);  // prints "    1", field width = 5
printf("%5.3i", 1);  // prints "  001", field width = 5, precision = 3
person Kerrek SB    schedule 30.01.2012
comment
Мне кажется, в следующий раз мне следует читать немного внимательнее, действительно здесь говорится о точности в тексте, который я цитировал. Ваше здоровье. - person paxdiablo; 30.01.2012