C语言使用sprintf转换打印十六进制值如何保留前导零
解决方案
问题根因是你当前使用的%x格式符没有指定固定输出宽度和前导零填充规则,同时%x默认匹配unsigned int类型,直接传入long类型存在类型不匹配隐患。
修改方法如下:
- 将格式符替换为
%04lx:0表示空缺位用前导零填充,4表示固定输出宽度至少为4位,l表示匹配的参数是long类型。如果需要输出大写十六进制字符,可替换为%04lX。
修改后的完整代码:
void reverse_and_encode(FILE *fpt, long *src, long *dst) { char reversed_src[5], reversed_dst[5]; sprintf(reversed_src, "%04lx", *dst); sprintf(reversed_dst, "%04lx", *src); printf("Reversed Source: %s\n", reversed_src); printf("Reversed Destination: %s\n", reversed_dst); }
注意:你定义的字符数组长度为5,刚好可以容纳4位十六进制字符+1位字符串结束符
\0,如果传入的long值大于0xFFFF(超过4位十六进制),输出的字符串长度会超过4,导致数组溢出触发未定义行为。如果需要处理更大的数值,请对应增大数组长度,或者先对输入值做& 0xFFFF的按位与操作截断为16位。
内容的提问来源于stack exchange,提问作者Neeraj Rana
相关产品推荐
相关产品推荐

