Per terminare quel ciclo devi esplicitamente introdurre il valore EOF da tastiera. In un terminale, generalmente, si ottiene tale carattere con la combinazione di tasti CTRL+Z. In un terminale DOS/Windows è inoltre possibile immettere direttamente il valore ASCII corrispondente tenendo premuto ALT e digitando le cifre (in questo caso 0, 2 e 6) sul tastierino numerico.
A ciò deve comunque fare seguito, in questo caso specifico, la pressione di INVIO.
Nello standard ANSI/INCITS/ISO familiarmente denominato
C89 (anno di promulgazione ANSI) o C90 (anno del recepimento da parte di ISO) e rivisto nel 1995 (al quale si riferisce in modo univoco e deterministico il K&R) il tipo di default è int, e come tale può essere omesso dalla dichiarazione del main().
Allo stesso modo, non è sempre strettamente necessario specificare il void per le funzioni prive di parametri, e nel caso del main quando non si intenda fare uso dei parametri da command line. Tuttavia, è opportuno farlo come regola di stile.
Solo negli standard successivi (C99, C11) sono state introdotte variazioni a queste fondamentali regole, che rendono fortemente consigliabile essere massimamente espliciti nella dichiarazione del main(). Peraltro, qualsivoglia
editor minimamente avanzato consente di predisporre macro e templates appositi, per ottenere il risultato desiderato con il minimo di digitazione.
La restituzione di un valore convenzionale (tipicamente EXIT_SUCCESS definito in stdlib.h) al termine del main è comunque sempre opportuna per i programmi in ambiente PC, quale che sia il sistema operativo installato. La sua omissione è giustificata (e necessaria) solo in contesti che al momento non ti interessano minimamente.
Sarà comunque bene chiarire subito che, ad onta dei troppi filoneisti che circolano da ambo i lati di cattedre e cadreghe dirigenziali, il numero di compilatori conformi a C89/C95 è superiore di un intero ordine di grandezza rispetto ai compilatori capziosamente aderenti ad ogni minimo aspetto dello standard C99 o, peggio ancora, del C11 (in pratica appena promulgato, visti i tempi geologici di adeguamento). Se ti interessa solo il mainstream, incontrerai un certo numero di compilatori C99-compliant, con qualche distinguo: ma fuori da questa rassicurante sandbox ti aspetta una jungla di incongruenze, soluzioni strettamente proprietarie, incompatiblità, stranezze e quant'altro. Un mondo ben diverso dai rassicuranti Python, Ruby o Tcl...