Поведение по умолчанию с ведущими нулями при использовании ISO C99 printf ("% Nd")? - PullRequest
2 голосов
/ 30 января 2012

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

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

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

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

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

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

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

1 Ответ

7 голосов
/ 30 января 2012

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

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
...