windows 下的 EOF 值

Value of EOF under windows

我写了这段代码:

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF)
        putchar(c);

    return 0;
}

在windows下,我发现我必须输入ctrl+z才能停止程序,我还打印了EOF的值,它是-1。 但是,当我输入 -1 而不是 ctrl+z 时,程序继续执行,我想了解原因。谢谢!

作为文本输入 "-1" 不是 return 整数值 -1 而是两个字符,即 '-' (对应于 ASCII 值 45 ) 和一个 '1'(对应于 ASCII 值 49)。两者都不等于 EOF(十进制为 -1)。

根据定义,您不能输入被 getchar() 消耗为负值的内容,因为负值被定义为表示 "End-of-file"。

如果你想读入一个整数值(如-1),使用scanf:

int num;
if (scanf("%d", &num)==1) { // successfully read one valid integral value?
    printf("you entered number %d:", num);
}

你需要稍微改变一下逻辑:

#include <stdio.h>
int main() {
int c;
int done = 0;

while (!done)
{
    c = getchar();
    if(c != '-')
        putchar(c);
    else
    {
        c = getchar();
        if (c == '1')//this is an EOF
        {
            done = 1; // and probably putchar the EOF
        }
        else
        {
              putchar('-');
              putchar(c);
        }
    }//else
}//while
return 0;

}

getchar()函数returns 或者刚刚输入的字符的数值(被视为unsigned char,所以它永远不会是负数),特殊值EOF表示没有更多的输入。

Windows 使用 Control-Z 触发和文件结束条件,这导致 getchar() 到 return 值 EOF。但是 EOF 不是字符值;它被特别选择为一个不能是字符值的值。

文件结尾是一个条件,而不是一个值。 EOF是数值,不是字符值;它是由 getchar() 编辑的 return 值,表示输入处于文件结束状态(或错误状态)。

(如果要读取整数值,无论是正数还是负数,都需要一次读取一个字符,然后计算该字符序列代表的整数值。整数值-1可以是输入为字符 '-' 后跟字符 '1'。C 有各种函数,如 atoi*scanf 家族,可以进行这种转换。)

EOF 不是 'value'。它是由 stdio 库定义的哨兵。

Ctrl/z 是一个 keystroke,由终端驱动程序解释并导致它向从中读取的应用程序通知流结束,这导致 C read() 到 return 零,这导致 getchar() 到 return EOF。

Unix 上对应的击键,Linux,等等,是Ctrl/d。