带有 getchar() 和 EOF 的 C 程序

C Program with getchar() and EOF

为什么我输入EOF(Ctrl-D)时程序会进入死循环?

    #include  <stdio.h>
    
    main()
    {
            int c = EOF ;
    
            while(c==EOF)
            {
                    printf("input value c=%d \n",c);
                    printf("EOF=%d \n",EOF);
                    c = getchar();  //expect the while loop to pause here and wait for input
    
            }
    
            printf("the value of last input c=%d \n",c);
    
    }

当我输入任何其他字符时,程序会按预期立即退出。 但是当我输入 EOF (Ctrl-D) 时,我希望程序在 while 循环中重复并等待下一个用户使用 getchar 输入。

更新:我阅读了 shell 这个程序运行的手册页 GNU bash 版本 5.0.3(1)-release (x86_64-pc-linux-gnu)

的联机帮助页
Commands for Changing Text
       end-of-file (usually C-d)
              The  character  indicating  end-of-file  as set, for example, by ``stty''.  If this character is read
              when there are no characters on the line, and point is at the beginning of the line, Readline  inter‐
              prets it as the end of input and returns EOF.

我认为发生的事情是,当我输入 EOF 作为输入时,shell 不再将输入传递给程序,因此程序只是跳过 c=getchar(); 行。并重复循环。 任何进一步的见解将不胜感激。

Why does the program enter infinite loop when I input EOF (Ctrl-D)?

一旦文件由于 OP 的 CtrlD 而关闭,getchar() 不会等待任何事情,只是 returns EOF 因为设置了 文件结束指示器

7.21.7.6 The getchar function
If the stream is at end-of-file, the end-of-file indicator for the stream is set and getchar returns EOF.

要让 getchar() 等待另一个字符,请清除 文件结束指示符 。也许使用 clearerr() () 清除 error 文件结束指示符 .


when I enter EOF as input the shell no longer passes input to program so program just skips the line c=getchar();

我会说 getchar(),当设置 文件结束指示器 时,不会调用 shell 获取更多数据,并且只是 returns EOF。详细信息是特定于实现的。