我正在学习覆盆子pi上的C编程,但是我发现我的程序从未成功捕获EOF.我char c=0; printf("%d",c-1);用来测试char类型,发现char类型范围从0到255,作为unsigned short.但EOF定义的stdio.h是(-1).我的Pi上安装了错误的cc包吗?我该怎么解决?如果我手动更改了EOF值stdio.h,还会有进一步的问题吗?
令我担心的是,当我从K&R书中学习时,有一些例子使用了代码while ((c=getchar())!=EOF),我在我的Ubuntu机器上跟着它,它工作正常.我只是想知道现代C语言是否放弃了这种语法,或者我的Raspberry Pi中是否存在冲突?
这是我的代码:
#include <stdio.h>
int main( void )
{
char c;
int i=0;
while ((c=getchar())!=EOF&&i<50) {
putchar(c);
i++;
}
if (c==EOF)
printf("\nEOF got.\n");
while ((c=getchar())!=EOF&&i<500) {
printf("%d",c);
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
即使我将输入重定向到文件,它仍然在屏幕上打印255,永远不会终止此程序.
最后我发现我错了,在K&R书中,它将c定义为int,而不是char.问题解决了.
你需要通过存储读取的字符fgetc(),getchar()等等.在int这样你就可以赶上EOF.这是众所周知的,到处都是如此.EOF必须与所有正确的字符区分开来,因此决定将fgetc()返回有效字符等函数作为非负值(即使char已签名).文件结束条件由信号通知-1,这是负的,因此不能与任何有效字符fgetc()可能返回冲突.
不要编辑系统头文件,尤其是不要更改那里定义的常量值.如果你这样做,你就打破了这些标题.请注意,即使您更改了EOF标头中的值,也不会更改值函数,例如fgetc()文件结束时返回或错误,它只会使EOF错误值.