#define NEWLINE '\n'
#define SPACE ' '
int count = 0;
while((ch = getchar()) != EOF)
if(ch != NEWLINE && ch != SPACE)
printf("There are %d characters input\n" , count);
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
^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
^d on Linux) does not cause the terminal driver to send EOF. It only makes it flush the buffer to your process (with no
^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:
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".