代码之家  ›  专栏  ›  技术社区  ›  うちわ 密か

windows下的EOF值

  •  3
  • うちわ 密か  · 技术社区  · 7 年前

    #include <stdio.h>
    
    int main() {
        int c;
    
        while ((c = getchar()) != EOF)
            putchar(c);
    
        return 0;
    }
    

    然而,当我输入-1而不是ctrl+z时,程序会继续执行,我想知道为什么。非常感谢。

    4 回复  |  直到 7 年前
        1
  •  3
  •   Stephan Lechner    7 年前

    套房 "-1" -1 但是有两个字符,即 '-' (对应于ASCII值 45 )和a '1' (对应于ASCII值 49 ). 两者相比并不等于 EOF 十进制)。

    getchar() ,因为定义负值表示“文件结束”。

    如果你想读入一个整数值(比如 -1 scanf :

    int num;
    if (scanf("%d", &num)==1) { // successfully read one valid integral value?
        printf("you entered number %d:", num);
    }
    
        2
  •  3
  •   Keith Thompson    7 年前

    getchar() 函数返回 任何一个 刚输入的字符的数值(视为 unsigned char ,所以它永远不会是负面的), 特殊值 EOF 这表明没有更多的输入。

    Windows使用Control-Z来触发和结束文件条件,这会导致 getchar() EOF . 但是 EOF 不是字符值;它被专门选择为不能作为字符值的值。

    文件结尾是一个条件,而不是一个值。 是数值,但不是字符值;它是由返回的值 getchar() 指示输入处于文件结束状态(或错误状态)。

    -1 可以输入为字符 '-' 然后是角色 '1' . C有多种功能,如 atoi *scanf

        3
  •  2
  •   user207421    7 年前

    EOF不是“值”。它是由 stdio 图书馆

    击键 ,由终端驱动程序解释,并使其向从中读取的应用程序通知流结束,这导致C read() 返回零,这导致 getchar()

    在Unix、Linux等平台上,对应的击键是Ctrl/d。

        4
  •  -1
  •   Paul Gibson    7 年前

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

    #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;
    

    }