2013-07-09 13 views
6

sto lavorando attraverso "The C Programming Language" di K & R e l'esempio 1.5 mi ha messo in difficoltà:teoria dietro getchar() e putchar() Funzioni

#include <stdio.h> 

/* copy input to output; 1st version */ 
int main(int argc, char *argv[]) 
{ 
    int c; 

    while ((c = getchar()) != EOF) 
     putchar(c); 

    return 0; 
} 

capisco che 'getchar()' prende un carattere per 'putchar()' per visualizzare. Tuttavia, quando eseguo il programma nel terminale, perché posso passare un'intera riga di caratteri per "putchar()" da visualizzare?

+0

È semplice, dovrebbe essere un duplicato, comunque guarda la risposta :) – 0decimal0

risposta

20

Perché il terminale è bufferizzato in linea. getchar() e putchar() funzionano ancora solo su singoli caratteri, ma il terminale attende con l'invio dei caratteri al programma fino a quando non hai inserito un'intera riga. Quindi getchar() ottiene il carattere da quel buffer uno alla volta e putchar() li visualizza uno per uno.

Aggiunta: che il terminale è buffer di riga significa che invia l'input al programma quando viene rilevato un carattere di nuova riga. Di solito è più efficiente inviare blocchi di dati anziché un carattere alla volta. Offre inoltre all'utente la possibilità di modificare la riga prima di premere Invio.

Nota: Linea buffer può essere disattivato disabilitando canonical mode for the terminal e chiamando setbuf con NULL su stdin.

+0

Questo ha senso. Grazie! – Raeven

+0

+1 per la spiegazione. Ma puoi per favore approfondire di più su questa linea: - "Perché il tuo terminale è a buffer di linea"? –

+0

+1 anche da me :) – 0decimal0

2

Sì, puoi scrivere quello che vuoi purché non sia un char EOF, la tastiera è un dispositivo I/O speciale, funziona direttamente tramite lo BIOS ei caratteri digitati sulla tastiera sono direttamente inseriti in un buffer questo buffer è, nel tuo caso letto dal primitivo getchar(), quando scrivi una frase stai spingendo i dati nel buffer e la funzione getchar() è in un ciclo infinito, questo è il motivo per cui funziona.

È possibile fare altre domande se si desiderano ulteriori dettagli su come funziona l'IO Device.

Cheers.

+0

Grazie mille! – Raeven

+0

Non esiste una cosa come il "carattere EOF", almeno dai giorni di CP/M. 'EOF' in C è solo un valore speciale restituito da' getchar() 'quando il flusso di input è terminato; pensaci come un codice di errore, non come un personaggio. –

+0

Prego Raeven –