[英]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.