2014-10-07 223 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)。