使用十六进制字符作为 c 程序的输入会更改字符吗?

Using hex characters as input to a c program changes the characters?

我有一个名为 "hex" 的简短 C 程序,它接受两个字符并输出它们对应的十六进制代码:

int main(void) {
    unsigned char var[3];
    printf("Enter two hex characters: ");
    scanf("%2s", var);
    printf("%x ", var[0]);
    printf("%x ", var[1]);

}

现在,当我使用由十六进制代码中的两个字符 "A" 和“0”组成的输入调用此程序时:

echo -e "\x41\x00" | ./hex

然后输出是(如预期的那样)“41 0”。 但是当我用十六进制代码“0d”调用这个程序两次时:

echo -e "\x0d\x0d" ./hex

那么输出是“0 bb”? 为什么会这样?我该怎么做才能使用十六进制代码“0d”的正确输入而不是我正在使用的输入?

编辑: scanf 应该在 print 语句之前,这是一个复制粘贴错误。我更正了。

打印必须是阅读后的。

另外%s会跳过换行符,\x0d是CR,换行符之一,所以你应该使用fread()来避免输入被跳过。

#include <stdio.h>

int main(void) {
    unsigned char var[3];
    fread(var, 1, 2, stdin);
    printf("%x ", var[0]);
    printf("%x ", var[1]);
    printf("Enter two hex characters: ");
}

你的代码很大未定义的行为。您打印未初始化数组的元素。在打印你 scanf 那些元素之后。

你不觉得这个顺序有点奇怪吗?