#include <stdio.h>
#include <string.h>
main()
{
char buff[255];
snprintf(buff, 255, "%02x", 0xFFFFFF);
printf("%s\n", buff);
}
我期待上面的代碼打印ff
(因爲我就給%02X),但OP是fffff
。我究竟做錯了什麼?使用的snprintf要打印限制的十六進制值
#include <stdio.h>
#include <string.h>
main()
{
char buff[255];
snprintf(buff, 255, "%02x", 0xFFFFFF);
printf("%s\n", buff);
}
我期待上面的代碼打印ff
(因爲我就給%02X),但OP是fffff
。我究竟做錯了什麼?使用的snprintf要打印限制的十六進制值
你的期望是錯誤的。
從the manual page for the *printf()
family:
在任何情況下做了字段的一個不存在的或小的字段寬度截斷;如果轉換結果寬於字段寬度,則字段將展開以包含轉換結果。
可以使用精密( 「.N
」)改性劑,但沒有使用的字段寬度截斷字符串:
printf("%2s and %.2s", "foo", "foo");
打印
foo and fo
不能使用精度進行截斷整數。
可以使用二進制掩碼,更改:
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
打印一個小端的整數與一個大端的整數的最低字節是否有區別? – usr2564301 2014-10-07 09:30:33
@Jongware,沒有什麼區別,但我不知道OP是否希望將'0xAABBCC'的末尾作爲一個字符串('0xCC')或作爲一個數字(小尾數爲'0xCC',大尾數爲'0xAA' )。 – 2014-10-07 09:37:17
這確實不清楚,OP不妨使用'char buff [255] =「ff」;'。 – usr2564301 2014-10-07 09:40:57
正如Unwind’s answer所述,只能傳遞最小值,而不能將整數轉換的最大字段寬度傳遞給*printf
。
只要你只能換算成每呼叫的整數,則可以使用尺寸參數snprintf
:
snprintf(buff, 3, "%02x", 0x9abcdef);
輸出(與其它的不變代碼):
9a
我改變了號碼被轉換以說明與掩碼的差別,0x9abcdef & 0xff
是0xef
並且用0xff000000
(4字節整數的最高位字節)進行掩碼產生0x9
。我不知道一個更簡單的方法來獲得兩個最高階的非零半字節(如果它們不存在,則在左側填充0)。
澄清,這是整數;你可以真正截斷字符串。 – 2014-10-07 09:04:57