使用十六进制字符作为c程序的输入会改变字符吗?
我有一个名为hex的短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 现在,当我调用这个程序时,输入由十六进制
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;