警告:0标志被忽略,精度和'%x'gnu_printf格式

Ish*_*eet 2 c printf warnings data-structures

我在C中编译时收到以下警告

   ../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
Run Code Online (Sandbox Code Playgroud)

错误来自的行

        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]);
Run Code Online (Sandbox Code Playgroud)

tabptr是struct arp_entry的指针

PACKED struct arp_entry {
  u16_t ipaddr[2];
  struct uip_eth_addr ethaddr;
  u8_t time;
#ifdef _ALIGNED_
  u8_t dummy;
#endif
}
Run Code Online (Sandbox Code Playgroud)

和ethadder是struct uip_eth_addr的指针

PACKED struct uip_eth_addr {
  u8_t addr[6];
}  ;
Run Code Online (Sandbox Code Playgroud)

如果有人可以分享一下这个警告的话.我只知道%0.2x意味着字符为两位数HEX.救命!

jpa*_*cek 6

格式字符串%0.2x表示:

  • 以十六进制打印无符号整数
  • 打印至少两个数字
  • 用左边的零填充它

由于精度定义了要输出的最小位数,因此将忽略零填充(来自规范).你可以使用%.2x或者%02x那样做你想做的事.

要得到

   1
  11
55555
Run Code Online (Sandbox Code Playgroud)

你用的%4x.

  01
  11
 111
Run Code Online (Sandbox Code Playgroud)

将会 %4.2x

0001
0011
55555
Run Code Online (Sandbox Code Playgroud)

会是%04x%.4x.

请注意,值已签名时存在差异.精度定义了数字的位数,这意味着该值将占用符号的另一个空间.使用最小输出宽度,已经计算了符号:

$ printf "%.5i\n%05i\n" '-11' -11
-00011
-0011
Run Code Online (Sandbox Code Playgroud)