I wrote a simple echo program, which reads standard input character-by-character and then prints it to standard output character-by-character.

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF) {
        putchar(c);
    }
    return 0;
}

I was expecting it to break out of the while loop and terminate when I key-in Ctrl-Z, but the program keeps running.

Sample run:

(Input) all yuor base are belong to usCtrl-Z
(Output) all yuor base are belong to us
continue waiting for input...

One (strange) thing I noticed is the program will terminate only when Ctrl-Z is entered all by itself.

(Input) oh naise
(Output) oh naise
(Input) Ctrl-Z
programing terminates...

Why does this happen? Why does the program not terminate when Ctrl-Z is with other characters? WHY IS THE WORLD COMING TO AN END?!

Anyway, I am using Command Prompt (if that matters), and thanks in advance for any help.

Edited 6 Years Ago by popcorn99: n/a

Ctrl z is not a C function. IOW, the interpretation of ctrl-z is system dependent, and is not necessarily EOF. For example, on unix, ctrl-d is used as EOF. On systems where ctrl-z is used, it still doesn't always get interpreted as eof, as you have seen

for microsoft OS, ctrl-z is only EOF when it is found at the beginning of the input stream. in this case EOF is a negative value (-1). when ctrl-z is found in the middle of an input stream after text, it is interpreted as a non-printable ascii character, just like any other escaped character. in this case:

ctrl-a = 0x01
ctrl-b = 0x02
...
ctrl-z = 0x1A

you can test it yourself by trying different combinations of text and control characters. remember the printf() is blocking and will buffer the standard input until a newline is entered, so you'll have to hit <enter> after any given amount of text.

#include <stdio.h>

int main() {
    int c;

    while (1)
    {
        putchar(c = getchar());
        printf(" %c = %#X\n",c,c);
    }
    return 0;
}

Edited 6 Years Ago by jephthah: n/a

Comments
helpful.
leet h4x0r

Thanks, that answered my question.

Wait...
"remember the printf() is blocking and will buffer the standard input until a newline is entered"
Don't you mean getchar()?

Edited 6 Years Ago by popcorn99: n/a

no i meant the printf() that i added in my version of your code.

depending on environment, printf often blocks the output until a newline is received.

This question has already been answered. Start a new discussion instead.