6

Why Ctrl+Z does not trigger the loop to finish on the following small program?

#include <stdio.h>

main()
{
    int c;
    while ((c = getchar()) != EOF)
    {
        //nothing 
    }

    return 0;
}

If I enter: test^ZEnter, it does not get out of the loop.

I found related questions around (here and here) but none to explain it for C (not C++) under Windows.

Note: I use Visual Studio 2015 PRE on a windows 8.1

8
  • 1
    @ARBY , CTRL+C doesn't send EOF, right?
    – Spikatrix
    Commented Jul 7, 2015 at 6:43
  • 1
    @CoolGuy Oh sorry, I meant ctrl+D as in *nix.
    – Raman
    Commented Jul 7, 2015 at 6:45
  • stackoverflow.com/questions/1782080/…
    – Ediac
    Commented Jul 7, 2015 at 6:56
  • This link might help (stackoverflow.com/questions/11378899/…)
    – Raman
    Commented Jul 7, 2015 at 7:02
  • 4
    @Alex Your problem is clearly explained in the first link you provide. In short, since there are characters to be flushed into the stdin, CTRL+Z and enter flushes those characters instead of sending EOF. In other words, CTRL+Z (windows, DOS) and CTRL+D (Linux, Unix, OSX etc) send EOF if there are no more characters to be flushed to the stdin.
    – Spikatrix
    Commented Jul 7, 2015 at 7:42

2 Answers 2

5

You need to hit Enter and then use ctrl+Z and then Enter again.

or, you may also use F6

-4

EOF like you use it is not a character. It's the status in which that stream is.

I mean, heck, you even link this question, so you might as well read the accepted answer:

The underlying form of an EOF is a zero-length read.

It's not an "EOF character".

http://www.c-faq.com/stdio/getcharc.html cites a different case than yours, where someone stored the return value of getchar in a char. The underlying problem still occurs occasionally: different runtimes implement different values for the EOF integer (which is why I said, it's not an EOF character), and things love to go wrong. Especially in Visual C++, which is not a "real" C compiler but a C++ compiler with a compatibility mode, it seems things can go wrong.

9
  • So why does Ctrl+Z not trigger "the status in which that stream is" to EOF? Commented Jul 7, 2015 at 6:46
  • it probably does, but you're not checking for that. Commented Jul 7, 2015 at 6:47
  • 1
    How does one check for it with getchar() then? Commented Jul 7, 2015 at 6:48
  • 1
    Apparently people like to do it. Commented Jul 7, 2015 at 6:49
  • 4
    The problem in the cited case is using char as the variable; the posted code uses int, correctly, which can detect the EOF "out-of-band" state. Commented Jul 7, 2015 at 7:07

Not the answer you're looking for? Browse other questions tagged or ask your own question.