EOF in Windows command prompt doesn't terminate input stream

后端 未结 2 750
悲&欢浪女
悲&欢浪女 2020-11-27 07:40

Code:

#include 
#define NEWLINE \'\\n\'
#define SPACE \' \'

int main(void)
{
    int ch;
    int count = 0;

    while((ch = getchar()         


        
相关标签:
2条回答
  • 2020-11-27 07:50

    This is true in almost every terminal driver. You'll get the same behavior using Linux.

    Your program isn't actually executing the loop until \n or ^z has been entered by you at the end of a line. The terminal driver is buffering the input and it hasn't been sent to your process until that occurs.

    At the end of a line, hitting ^z (or ^d on Linux) does not cause the terminal driver to send EOF. It only makes it flush the buffer to your process (with no \n).

    Hitting ^z (or ^d on Linux) at the start of a line is interpreted by the terminal as "I want to signal EOF".

    You can observe this behavior if you add the following inside your loop:

    printf("%d\n",ch);
    

    Run your program:

    $ ./test
    abc                      <- type "abc" and hit "enter"
    97
    98
    99
    10
    abc97                    <- type "abc" and hit "^z"
    98
    99
    

    To better understand this, you have to realize that EOF is not a character. ^z is a user command for the terminal itself. Because the terminal is responsible for taking user input and passing it to processes, this gets tricky and thus the confusion.

    A way to see this is by hitting ^v then hitting ^z as input to your program.

    ^v is another terminal command that tells the terminal, "Hey, the next thing I type - don't interpret that as a terminal command; pass it to the process' input instead".

    0 讨论(0)
  • 2020-11-27 08:09

    ^Z is only translated by the console to an EOF signal to the program when it is typed at the start of a line. That's just the way that the Windows console works. There is no "workaround" to this behaviour that I know of.

    0 讨论(0)
提交回复
热议问题