Почему "% .3i" печатает ведущие нули? - PullRequest
1 голос
/ 20 февраля 2009

Был какой-то сюрприз с некоторым кодом сегодня. Я компилировал его в AIX с уровнем предупреждения, установленным на анальный, чтобы увидеть, какие скрытые проблемы могут скрываться. Что-то новое выползло из кода.

 1540-2837 (W) '0' flag is disregarded when combined with 
               precision and 'i' printf format.

Посмотрев на оскорбительную строку, я собрал небольшую программу для ее воспроизведения. Тестирование на нескольких платформах показало, что это не специфично для AIX.

Первый printf ниже имитирует то, что было найдено в программе.

#include <stdio.h>    
int main(void)
{
    int x = 3;

    printf("Format 0.3i <%0.3i>\n", x);  // prints 003, and AIX does a warning
    printf("Format  .3i <%.3i>\n", x);   // prints 003, with no warning
    printf("Format   3i <%3i>\n", x);    // prints   3, with no warning.

    return 0;
}

Обычно, если бы требовались начальные нули, формат "03i" прекрасно справился бы с этой задачей.

Что на самом деле означает «% .3i»?

Почему у него такое поведение?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2009

.X, где x - это число, означающее «печатать не менее X» цифр, поэтому% .3i означает печать не менее 3 цифр. Если число меньше 100, оно заполняется нулями.

Из документа на принтф

"Для целочисленных спецификаторов (d, i, o, u, x, X): точность указывает минимальное количество записываемых цифр. Если записываемое значение короче этого числа, результат дополняется начальным нули. Значение не усекается, даже если результат длиннее. Точность 0 означает, что для значения 0 не записано ни одного символа. "

Существует еще одна концепция, «ширина» (например, «% 3i»), которая приводит к выводу определенного количества символов (необязательно цифр), а указанный 0 используется для указания того, что эти символы должны быть 0, как в «003», а не пробелы, как в «3»)

0 голосов
/ 20 февраля 2009

С man 3 printf:

Если точность дана с числовое преобразование (d, i, o, u, x и X), флаг 0 игнорируется.

. указывает точность, и поэтому 0 игнорируется. Что касается "Почему?" об этом, вы должны спросить авторов стандарта C:)

...