2012-04-09 3 views
2

я получаю следующее предупреждение, когда я компиляции в C.предупреждение: 0 флаг игнорируется с точностью и «% х» формат gnu_printf

../tcpuip/uip_arp.c: In function 'display_arp_table': 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p 
    rintf format 
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_printf format 

линия, где приходит ошибка

 RELEASE_MSG("MAC: %0.2x.%0.2x.%0.2x.%0.2x.%0.2x.%0.2x ",(unsigned char)tabptr->ethaddr.addr[0],(unsigned char)tabptr->ethaddr.addr[1],(unsigned char)tabptr->ethaddr.addr[2],(unsigned char)tabptr->ethaddr.addr[3],(unsigned char)tabptr->ethaddr.addr[4],(unsigned char)tabptr->ethaddr.addr[5]); 

tabptr является указателем структуры arp_entry

PACKED struct arp_entry { 
    u16_t ipaddr[2]; 
    struct uip_eth_addr ethaddr; 
    u8_t time; 
#ifdef _ALIGNED_ 
    u8_t dummy; 
#endif 
} 

и ethadder является указателем на STRUCT uip_eth_addr

PACKED struct uip_eth_addr { 
    u8_t addr[6]; 
} ; 

Пожалуйста, если кто-нибудь может рассказать об этом предупреждении. Я просто знаю, что% 0.2x означает символ как двухзначный HEX. Помогите!

ответ

3

Строка формата %0.2x средства:

  • печать целое число без знака в шестнадцатеричной
  • печать по крайней мере два числа
  • Прокладка слева с нулями

Поскольку точность определяет минимальное количество цифр для вывода, нулевое заполнение будет игнорироваться (из спецификации). Вы можете использовать %.2x или %02x, которые будут делать то, что вы хотите.

Чтобы получить

1 
    11 
55555 

Вы бы использовать %4x.

01 
    11 
111 

будет %4.2x

0001 
0011 
55555 

будет %04x или %.4x.

Обратите внимание, что при подписании значения существует разница. Точность определяет число цифр, что означает, что значение займет еще одно место для знака. С минимальной выходной шириной знак уже засчитывается:

$ printf "%.5i\n%05i\n" '-11' -11 
-00011 
-0011 
2

Фактически, %2.2x будет двухзначным шестнадцатеричным. 0 - это флаг формата, указывающий нулевое заполнение вместо пустого заполнения, но поскольку вы не указали ширину поля, только точность, это бессмысленно.

3

Вы, конечно, хотел написать:

%02x вместо %0.2x

Смежные вопросы