繁体   English   中英

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

[英]Can someone explain unexpected sprintf output?

我有一个非常简单的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个字节及其实际值。 谁能告诉我我做错了什么?

0x30是“ 0”的ASCII代码,您正在混合char和int表示形式。

看来您正在将其转换为十六进制。 30是字符“ 0”的十六进制。 将第一个sprintf修改为:

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

或者只是

printf("%08x", STATUS);

电话:

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

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

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

尽管我不确定这在一般情况下是否会满足您的需求。

当使用指定符x打印任何内容时,printf希望得到一个数字作为参数。 您要传入一个字符,以便它打印出该字符的ascii值。 尝试改变

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

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

它正在打印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]);
    }
}

如果您要确定STATUS变量的宽度为4个字节,则包括inttypes.h(C99标头)并将其声明为:

uint32_t STATUS = 0;

如果您还想确定它是big-endian,则必须将其声明为字节数组:

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

可以肯定的是,这是在便携式C语言中可以做的最好的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM