我试图从十六进制值的stdin中读取文件:
0 x0a
0x00 0x0a
0x61 0x00 0x61 0x00 0x0a
0x00 0x00 0x00
int i = 0;
unsigned char x = 0;
while(x != 0x0a && x != EOF){
fread(&x, 1 , 1, stdin);
tab[i] = x;
i++;
}
与此循环,我得到分割错误与最后一行。
如果没有看到tab
的声明,我们就不能确定是什么触发了段错误(很可能是对tab
的越界访问)。
然而,你不应该使用fread
和stdin
- fread
是读取二进制文件,它将读取屏幕上每个字符的二进制表示。你实际上是在读取一个字符的字节表示形式,就像你在x = getchar()
或scanf("%c", &x)
所以你会读到"0x0an0x00 0x0an"等等
现在,您正在针对0x0a
的值进行测试,该值实际上是'n'
,因此您可能不会读取超过第一行的内容。
你要做的是:
scanf("0x%x", &x);
它将读取单个十六进制值,例如"0x0a",然后您可以根据上面的常量进行检查。
另一件事-你已经声明x为unsigned char
,但正在测试它对EOF
,这是一个int, -1
。我很惊讶编译器没有给你一个警告。你应该总是把这个值读入int类型,所以我将它重新声明为int
。
另外,当读取二进制文件(即使用fread
)时,您将永远不会读取EOF值,因为这是在文件中找到的有效值。相反,如果到达文件末尾,fread
将返回0。你可以使用feof(file)
来检查它是否已经到达