首页 > 解决方案 > 使用 sprintf 转换和打印十六进制值(保持前导零)

问题描述

我有以下 C 代码,它采用两个长整数值并使用 sprintf 函数将它们转换为两个十六进制字符串:

void reverse_and_encode(FILE *fpt, long *src, long *dst) {
    char reversed_src[5], reversed_dst[5];
    sprintf(reversed_src, "%x", *dst);
    sprintf(reversed_dst, "%x", *src);
    printf("Reversed Source: %s\n", reversed_src);
    printf("Reversed Destination: %s\n", reversed_dst);
}

但是当我打印十六进制值字符串时,我无法在输出中获得前导零。例如。

Reversed Source: f168 // for integer 61800
Reversed Destination: 1bb // This output should be "01bb" for integer 443

标签: c++ciohexprintf

解决方案


采用

sprintf(reversed_src, "%04x", ( unsigned int )*dst);

请注意,如果表达式2 * sizeof( long )(十六进制数字的数量)可以等于 8 或 16。对于 long 类型的对象,请注意这一点。所以你需要像这样声明数组

char reversed_src[2 * sizeof( long ) + 1], reversed_dst[2 * sizeof( long ) + 2];

然后写例如

sprintf(reversed_src, "%0*lx", 
        ( int )( 2 * sizeof( long ) ), ( unsigned long )*dst);

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    enum { N  = 2 * sizeof( long ) };
    char reversed_src [N + 1];

    long x = 0xABCDEF;

    sprintf( reversed_src, "%0*lX", N, ( unsigned long )x );

    puts( reversed_src );
   
    return 0;
}

程序输出为

0000000000ABCDEF

推荐阅读