2010-05-28 2 views
2

Я получаю следующее предупреждение при компиляции некоторое наследие C код на Ubuntu кармического, используя GCC 4.4.1предупреждение: «0» флаг игнорируется с точностью и «%» я gnu_printf формат

данное предупреждение:

SRC/filename.c: 385: предупреждение: '0' флаг игнорируется с точностью и '% я' формат gnu_printf

фрагмент, который приводит к тому, предупреждение испускается является:

char  buffer[256] ; 
long  fnum ; 
/* some initialization code here ... */ 
sprintf(buffer, "F%03.3i.DTA", (int)fnum); /* <- warning emitted here */ 

Я думаю, что понимаю предупреждение, но я хотел бы зарегистрироваться здесь, чтобы убедиться, что я прав, а также (определенный) правильный способ разрешения этого.

+0

Каково ваше понимание? Правильный способ его устранения - это, очевидно, удалить нуль. – 2010-05-28 08:14:56

+0

я понимаю, что существует несовместимость между типом данных и спецификатором формата (это, скорее всего, связано с попыткой форматирования целочисленного значения с точностью). – morpheous

+0

Нет, это действительно так, чтобы иметь точность для интегрального спецификатора. Как указано в man-странице, оно используется для указания минимального количества цифр, используемых для форматирования. –

ответ

3

На странице printf(3) людей:

0  The value should be zero padded. For d, i, o, u, x, X, a, A, e, 
      E, f, F, g, and G conversions, the converted value is padded on 
      the left with zeros rather than blanks. If the 0 and - flags 
      both appear, the 0 flag is ignored. If a precision is given 
      with a numeric conversion (d, i, o, u, x, and X), the 0 flag is 
      ignored. For other conversions, the behavior is undefined. 

Таким образом, вы можете иметь либо нулевую заливку или минимальное количество цифр, но не оба.

+0

Больше нечего сказать. RTFM. – Clifford

+0

извините, но ... как бы мы набиваем нулями, если мы не выражаем длину поля независимо от длины значения? – PypeBros

+0

@sylvanulg: Указание точности вызывает 'printf()', чтобы заполнить ее '0', чтобы заполнить эту длину. Просто убедитесь, что точность больше или равна ширине поля. –