2014-02-14 234 views
5

什麼用使用HHX代替X,在下面mac_str的代碼是字符指針MACuint8_t陣列什麼是hh和h格式說明符的需要?

sscanf(mac_str,"%x:%x:%x:%x:%x:%x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]); 

當我嘗試上述代碼它給出警告,

warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 8 has type ‘uint8_t *’ [-Wformat] 

,但我在一些代碼看到他們指定

sscanf(str,"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]); 

它不給任何警告

但兩者都工作一樣,有什麼用HHX代替X的需要,我搜索在網,但因此未得到直接的回答

+0

'hh'表示,作爲一個歷史的猜測,對於half_的_half。那就是一個字節。 –

+0

http://stackoverflow.com/questions/4586962/what-is-the-purpose-of-the-h-and-hh-modifiers-for-printf –

+1

use'sscanf(「%」SCNx8,&x);' BLUEPIXY

回答

5

&mac[0]是指向unsigned char的指針。 %hhx表示相應的參數指向unsigned char。對方孔使用方形釘:格式字符串中的轉換說明符必須與參數類型匹配。


其實,&mac[0]是一個指向uint8_t,而%hhx仍然是錯誤的uint8_t。它在許多實現中「起作用」,因爲uint8_t與許多實現中的unsigned char相同。但是,正確格式爲"%" SCNx8,如:

#include <inttypes.h> 
… 
scanf(mac_str, "%" SCNx8 "… rest of format string", &mac[0], … rest of arguments); 
+0

嚴格地說,我相信如果'uint8_t'存在,它必須和'unsigned char'一樣。 –

+0

@StephenCanon:我期待如此,但我很難解釋C 2011 7.20。1 1:「當定義了僅在不存在或存在初始** u **時定義的typedef名稱時,...」。我想知道一個實現是否可以提供'uint8_t',但不會提供'int8_t',因爲固執,然後不會被7.20.11強制使'uint8_t'成爲'unsigned char'或'char'。然後實現可以提供另一個整型,比如'__byte',它是一個無符號的8位整數,但不同於'char'或'unsigned char'。所以會出現鋸齒規則等等。 –

2

hhx轉換輸入轉換爲無符號字符,而x轉換爲無符號整數。並且由於uint8_t是typedef到unsigned char,hhx修復了警告。

5

hh長度修飾符,它指定參數的目標類型。轉換格式說明符x的默認值爲unsigned int*。與hh,它變成unsigned char*signed char*

有關更多詳細信息,請參閱表herein

+0

C11§7.21.6.2說「** x ** ....相應的參數應該是一個指向無符號整數「。我什麼都沒看到'signed int *'。 – chux

+0

@chux你似乎是對的,修正了這個,謝謝 – jrok