使用snprintf打印受限制的十六进制值

时间:2014-10-07 08:44:56

标签: c

#include <stdio.h>
#include <string.h>

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

我希望上面的代码能够打印ff(因为我给了%02x)但是op是fffff。我做错了什么?

3 个答案:

答案 0 :(得分:4)

你的期望是错误的。

来自the manual page for the *printf() family

  

在任何情况下,不存在或小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则扩展该字段以包含转换结果。

您可以使用精度(&#34; .N&#34;)修饰符截断字符串,但不使用字段宽度:

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

打印

foo and fo

您不能使用精度来截断整数。

答案 1 :(得分:3)

您可以使用二进制掩码,更改:

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

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

E.g:

#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

答案 2 :(得分:0)

正如Unwind’s answer所述,对于整数转换,您只能将最小字段宽度传递给*printf

只要您每次调用只转换一个整数,就可以使用snprintf的size参数:

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

输出(代码未改变):

9a

我更改了要转换的数字,以说明与屏蔽的区别,0x9abcdef & 0xff0xef,屏蔽0xff000000(4字节整数的最高位字节)产生{ {1}}。我不知道有一种更简单的方法来获得两个最高阶非零半字节(如果它们不存在则在左边填0)。