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

使用十六进制字符作为c程序的输入会改变字符吗?,c,linux,ubuntu,hex,C,Linux,Ubuntu,Hex,我有一个名为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]); } echo -e "\x41\x00" | ./hex 现在,当我调用这个程序时,输入由十六进制

我有一个名为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]);

}
echo -e "\x41\x00" | ./hex
现在,当我调用这个程序时,输入由十六进制代码中的两个字符A和0组成:

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

}
echo -e "\x41\x00" | ./hex
然后输出如预期的41 0。 但是当我用十六进制代码0d调用这个程序两次时:

echo -e "\x0d\x0d" ./hex
那么输出是0bb? 为什么会这样?如何使用十六进制代码0ds的正确输入而不是我正在使用的输入

编辑:
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: ");
}
您的代码是一个巨大的未定义行为。打印未初始化数组的元素。打印后,您可以扫描这些元素


你不觉得这个订单有点奇怪吗

我从echo-e\x41\x00./hex获得了输出A./hex。它不应该是echo-e\x41\x00 |/hex吗?如果我不能更改输入法scanf怎么办?有没有办法让它接受换行符作为输入,还是不可能?你可以像scanf%2c,var一样使用%c;