2

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

エラーが発生する行は

        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はstructarp_entryのポインタです

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

ethadderはstructuip_eth_addrのポインターです

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

誰かがこの警告についていくつかの光を共有できるかどうかお願いします。%0.2xは2桁の16進数としての文字を意味することを私は知っています。ヘルプ!

4

3 に答える 3

6

フォーマット文字列の%0.2x意味:

  • 符号なし整数を16進数で出力します
  • 少なくとも2つの数字を印刷する
  • 左からゼロで埋めます

精度は出力する最小桁数を定義するため、ゼロのパディングは(仕様から)無視されます。あなたが使うことができる%.2x%02x、それはあなたが望むことをするでしょう。

取得するため

   1
  11
55555

を使用します%4x

  01
  11
 111

だろう%4.2x

0001
0011
55555

%04xまたはになり%.4xます。

値が署名されている場合は違いがあることに注意してください。精度は数を定義します。つまり、値は符号のためにもう1つのスペースを占有します。最小出力幅では、符号はすでにカウントされています。

$ printf "%.5i\n%05i\n" '-11' -11
-00011
-0011
于 2012-04-09T10:38:52.337 に答える
3

あなたは確かに書きたかった:

%02xそれ以外の%0.2x

于 2012-04-09T10:35:38.627 に答える
2

実際に%2.2xは、2桁の16進数になります。 0は空白のパディングではなくゼロのパディングを示すフォーマットフラグですが、フィールド幅を指定せず、精度のみを指定したため、意味がありません。

于 2012-04-09T10:34:25.047 に答える