我有一个名为"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"one_answers"0"组成:
echo -e "x41x00" | ./hex
然后输出为(如预期的("41 0"。但是当我用十六进制代码"0d"调用这个程序两次时:
echo -e "x0dx0d" ./hex
那么输出是"0 bb"?为什么会这样?我可以做些什么来使用十六进制代码"0d"s的正确输入,而不是我正在使用的输入?
编辑: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
这些元素。
你不觉得这个订单有点奇怪吗?