#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