2014-10-07 78 views
1
#include <stdio.h> 
#include <string.h> 

main() 
{ 
    char buff[255]; 
    snprintf(buff, 255, "%02x", 0xFFFFFF); 
    printf("%s\n", buff); 
} 

我期待上面的代碼打印ff(因爲我就給%02X),但OP是fffff。我究竟做錯了什麼?使用的snprintf要打印限制的十六進制值

回答

4

你的期望是錯誤的。

the manual page for the *printf() family

在任何情況下做了字段的一個不存在的或小的字段寬度截斷;如果轉換結果寬於字段寬度,則字段將展開以包含轉換結果。

可以使用精密( 「.N」)改性劑,但沒有使用的字段寬度截斷字符串:

printf("%2s and %.2s", "foo", "foo"); 

打印

foo and fo 

不能使用精度進行截斷整數。

+0

澄清,這是整數;你可以真正截斷字符串。 – 2014-10-07 09:04:57

3

可以使用二進制掩碼,更改:

snprintf(buff, 255, "%02x", 0xFFFFFF); 

snprintf(buff, 255, "%02x", 0xFFFFFF & 0x0000FF); 

例如爲:

#include <stdio.h> 

int main(void) /* main() is not valid */ 
{ 
    char buff[255]; 
    snprintf(buff, 255, "%02x", 0x00BEEF & 0x0000FF); 
    printf("%s\n", buff); 
    return 0; 
} 

輸出:

ef 
+0

打印一個小端的整數與一個大端的整數的最低字節是否有區別? – usr2564301 2014-10-07 09:30:33

+0

@Jongware,沒有什麼區別,但我不知道OP是否希望將'0xAABBCC'的末尾作爲一個字符串('0xCC')或作爲一個數字(小尾數爲'0xCC',大尾數爲'0xAA' )。 – 2014-10-07 09:37:17

+0

這確實不清楚,OP不妨使用'char buff [255] =「ff」;'。 – usr2564301 2014-10-07 09:40:57

0

正如Unwind’s answer所述,只能傳遞最小值,而不能將整數轉換的最大字段寬度傳遞給*printf

只要你只能換算成每呼叫的整數,則可以使用尺寸參數snprintf

snprintf(buff, 3, "%02x", 0x9abcdef); 

輸出(與其它的不變代碼):

9a 

我改變了號碼被轉換以說明與掩碼的差別,0x9abcdef & 0xff0xef並且用0xff000000(4字節整數的最高位字節)進行掩碼產生0x9。我不知道一個更簡單的方法來獲得兩個最高階的非零半字節(如果它們不存在,則在左側填充0)。