#include <stdio.h>
#include <string.h>
main()
{
char buff[255];
snprintf(buff, 255, "%02x", 0xFFFFFF);
printf("%s\n", buff);
}
我希望上面的代码能够打印ff
(因为我给了%02x)但是op是fffff
。我做错了什么?
答案 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 & 0xff
为0xef
,屏蔽0xff000000
(4字节整数的最高位字节)产生{ {1}}。我不知道有一种更简单的方法来获得两个最高阶非零半字节(如果它们不存在则在左边填0)。