使用十六进制字符作为 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
那些元素之后。
你不觉得这个顺序有点奇怪吗?
我有一个名为 "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
那些元素之后。
你不觉得这个顺序有点奇怪吗?