Был какой-то сюрприз с некоторым кодом сегодня. Я компилировал его в 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»?
Почему у него такое поведение?