当-1无法在char中表示时,为什么EOF定义为-1?

soc*_*ser 1 c char eof

我正在学习覆盆子pi上的C编程,但是我发现我的程序从未成功捕获EOF.我char c=0; printf("%d",c-1);用来测试char类型,发现char类型范围从0到255,作为unsigned short.但EOF定义的stdio.h是(-1).我的Pi上安装了错误的cc包吗?我该怎么解决?如果我手动更改了EOFstdio.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.问题解决了.

fuz*_*fuz 5

你需要通过存储读取的字符fgetc(),getchar()等等.在int这样你就可以赶上EOF.这是众所周知的,到处都是如此.EOF必须与所有正确的字符区分开来,因此决定将fgetc()返回有效字符等函数作为非负值(即使char已签名).文件结束条件由信号通知-1,这是负的,因此不能与任何有效字符fgetc()可能返回冲突.

不要编辑系统头文件,尤其是不要更改那里定义的常量值.如果你这样做,你就打破了这些标题.请注意,即使您更改了EOF标头中的值,也不会更改值函数,例如fgetc()文件结束时返回或错误,它只会使EOF错误值.