2014-11-28 11 views
5

sto facendo funzionare il seguente programma dal C Programming Language libro:getchar() = EOF

#include <stdio.h> 
main() 
{ 
    int c; 
    while((c=getchar()) != EOF) 
    putchar(); 
} 

Quando ho eseguito questo programma, ottengo un comportamento inspiegabile. Se immetto i caratteri dalla riga di comando nella seguente sequenza: {'h', 'e', 'l', 'l', 'o', '\n', '^D'}, viene visualizzata la seguente risposta sullo schermo: hello, dopo l'immissione di \n e il programma si chiude una volta ^D inserito.

Tuttavia, quando cambio la sequenza nel modo seguente: {'h', 'e', 'l', 'l', 'o', '^D'}, viene visualizzata la seguente risposta sullo schermo: hello, ma il programma non si chiude. Non dovrebbe smettere quando entro ^D? Devo immettere ^D una seconda volta che il programma si chiude. O il programma si chiude solo dopo aver immesso ^D dopo \n. Non capisco perché il programma non si arresti, non importa quando inserisco ^D. qualche idea?

Sono in esecuzione su un sistema UNIX.

risposta

17

Quando si digita^D ('end-of-trasmissione') il buffer di input è arrossato e tutto ciò che fino ad ora digitato viene inviato al vostro programma (senza inviare^D carattere). È simile alla digitazione di carattere newline, tuttavia, in questo caso viene inviato anche il carattere newline. Un programma considera il suo input come chiuso quando legge zero caratteri. Questo succede quando digiti newline seguito da^D o due consecutive^D.

+3

nota che questa è una proprietà del flusso di ingresso del sistema operativo, non del programma C. –

+0

Grazie, Marian e Matt McNabb. Ho pensato che il buffer di input è stato svuotato digitando il carattere di nuova riga. Non ero a conoscenza di un comportamento simile con^D pure. – Nishi