2009-02-19 8 views
1

Сегодня был некоторый сюрприз с некоторым кодом. Я собирал его на AIX, с уровнем предупреждения, установленным на анал, чтобы увидеть, какие проблемы с мошенниками могут скрываться. Что-то новое вышло из кода.Почему «% .3i» печатает ведущие нули?

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»?

Почему у этого есть поведение, которое оно совершает?

ответ

5

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

С doc on printf

«для целочисленных спецификаторов (д, I, O, U, X, X): Точность задает минимальное количество цифр, чтобы записать Если значение, которое будет записано короче, чем это. число, результат дополняется ведущими нулями. Значение не усекается, даже если результат длиннее. Точность 0 означает, что для значения 0 не записывается символ.

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

+0

Great Globs of Glue. Я забыл RTFM Daniel Thank You. – EvilTeach

+0

@EvilTeach: проблем нет:] –

0

От man 3 printf:

Если точность дается с числовым преобразованием (д, I, O, и, х, и X), флаг 0 игнорируется.

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