【发布时间】:2019-02-26 07:17:26
【问题描述】:
我有这个代码:
unsigned char *command = "0000";
unsigned char foo = (hex_char_to_int(command[0]) << 4) | hex_char_to_int(command[1]);
unsigned char bar = (hex_char_to_int(command[2]) << 4) | hex_char_to_int(command[3]);
printf("foo: %02x, bar: %02x\r\n", foo, bar);
它使用这个功能:
unsigned char hex_char_to_int(unsigned char ch) {
switch (ch){
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 0xA;
case 'B': return 0xB;
case 'C': return 0xC;
case 'D': return 0xD;
case 'E': return 0xE;
case 'F': return 0xF;
case 'a': return 0xA;
case 'b': return 0xB;
case 'c': return 0xC;
case 'd': return 0xD;
case 'e': return 0xE;
case 'f': return 0xF;
default: return 0;
}
}
这是结果:
"JW\xd6\x96'$$LK\x90\xbbar: 3030\r\r\n"
这是在 Keil C51 编译器上,在 AT89C55WD 上,printf() 通过串行端口。
发生了什么事?
编辑
我把 printf 行改成
printf("%02x%02x\r\n", (unsigned int)foo, (unsigned int)bar);
所以它看起来像printf 中的一个错误。程序员们,请永远不要制作一个说谎的调试工具。求求你了。
【问题讨论】:
-
您的示例中的命令后没有分号,所以我不确定这是否会编译。还有一个溢出
command[4]is not incommandmax index is 3. -
这是正在使用的代码的确切顺序(其中的值除外)吗?这似乎不会导致问题。
-
还要检查非格式化字符串是否正确打印到串行控制台。
-
不,我已经清理了代码以删除任何可以识别它的内容。 @JesusRamos 是的,其他字符串打印正确,其他格式指定甚至可以根据输入正常工作。
-
听起来你的编译器不符合 C 语言标准——C 要求编译器在将
unsigned char作为参数传递给printf等可变参数函数时将unsigned int提升为unsigned int。
标签: c embedded printf keil c51