有人可以解释意外的sprintf输出吗?

时间:2009-07-30 10:33:30

标签: c

我有一个非常简单的sprintf问题。

int STATUS = 0;

char test[100];
int n = sprintf( test,"%04x", STATUS );
printf ("[%s] is a %d char long string\n",test,n);  

for(i=0 ; i<4 ; i++) {
  printf("%02x", test[i]); 
    }   
    printf("\n\n"); 

此代码的输出为30303030,这不是我打算输出的。基本上, 我想将00000000作为输出,因此整数值应占用输出中的4个字节 以其实际价值。谁能告诉我我做错了什么?

6 个答案:

答案 0 :(得分:4)

0x30是'0'的ASCII代码,你混合了char和int表示。

答案 1 :(得分:2)

您似乎将此转换为十六进制。对于字符“0”,30是十六进制。 将第一个sprintf修改为:

int n = sprintf( test,"%4d", STATUS );

或只是

printf("%08x", STATUS);

答案 2 :(得分:1)

电话:

 printf("%02x", test[i]);

使用2个十六进制数字将每个字符打印为整数。 30是十六进制48,它是'0'的ascii值。改为

 printf("%02c", test[i]); 

虽然我;我不确定在一般情况下这会是你想要的。

答案 3 :(得分:0)

printf期望在使用说明符x打印任何内容时获取一个数字作为参数。你正在传递一个角色,所以它打印出角色的ascii值。尝试更改

printf("%02x", test[i]); 

printf("%02x", test[i] - 0x30); 

答案 4 :(得分:0)

打印30而不是00,因为您打印的字符为'0'的整数值,其中ASCII为0x30,或十进制为48。

如果您想查看用于定义整数的原始字节,可以尝试这样的事情。

typedef union {
    int integerValue;
    uint8_t bytes[sizeof(int)];
} MyIntegerOrBytes;

void foo(void) {
    MyIntegerOrBytes value;
    value.integerValue = 100;
    for(int i = 0; i < sizeof(int); i += 1) {
        printf("byte[%d] = %d\n", i, value.bytes[i]);
    }
}

答案 5 :(得分:0)

如果您要问的是确定您的STATUS变量是4字节宽,那么请包含inttypes.h(C99标头)并将其声明为:

uint32_t STATUS = 0;

如果你还想确定它是big-endian,你必须将它声明为一个字节数组:

unsigned char STATUS[4] = { 0x00, 0x00, 0x00, 0x01 } /* STATUS = 1, 32bit BE */

非常确定这是便携式C中最好的。