2011-09-10 10 views
7

Codice:EOF nel prompt dei comandi di Windows non termina flusso di input

#include <stdio.h> 
#define NEWLINE '\n' 
#define SPACE ' ' 

int main(void) 
{ 
    int ch; 
    int count = 0; 

    while((ch = getchar()) != EOF) 
    { 
     if(ch != NEWLINE && ch != SPACE) 
      count++; 
    } 
    printf("There are %d characters input\n" , count); 

    return 0; 
} 

Domanda:

  1. Tutto funziona bene, ignorerà spazi e newline e uscita numero di caratteri immessi sullo schermo (in questo programma tengo solo virgola, punto esclamativo, numeri o qualsiasi simbolo di simbolo speciale stampabile come la e commerciale come carattere) quando colpisco la simulazione EOF che è ^z.

  2. Ma c'è qualcosa di sbagliato quando inserisco questa linea nel programma. Per esempio, inserisco questo: abcdefg^z, il che significa che ho inserito un carattere prima e sulla stessa riga di ^z. Invece di terminare il programma e stampare i caratteri totali, il programma continuerà a chiedere input.

  3. L'input di carattere di terminazione EOF funziona solo quando si specifica ^z su una singola riga o in tal modo: ^zabvcjdjsjsj. Perché sta succedendo?

risposta

14

Questo è vero in quasi tutti i driver del terminale. Avrai lo stesso comportamento usando Linux.

Il tuo programma non sta eseguendo il ciclo fino a quando \n o ^z è stato inserito da te alla fine di una riga. Il driver del terminale esegue il buffering dell'input e non è stato inviato al processo finché non si verifica ciò.

Alla fine di una riga, colpendo ^z (o ^d su Linux) fa non causa il driver di terminale per inviare EOF. Rende solo il buffer al processo (senza \n).

Colpire ^z (o ^d su Linux) all'inizio di una riga viene interpretato dal terminale come "Voglio segnalare EOF".

È possibile osservare questo comportamento se si aggiunge il seguente all'interno del vostro ciclo:

printf("%d\n",ch); 

Eseguire il programma:

$ ./test 
abc      <- type "abc" and hit "enter" 
97 
98 
99 
10 
abc97     <- type "abc" and hit "^z" 
98 
99 

Per comprendere meglio questo, è necessario rendersi conto che EOF non è un carattere. ^z è un comando utente per il terminale stesso. Poiché il terminale è responsabile per prendere l'input dell'utente e passarlo ai processi, questo diventa complicato e quindi la confusione.

Un modo per vedere questo è colpendo ^v quindi premendo ^z come input per il programma.

^v è un altro comando di terminale che indica al terminale: "Ehi, la prossima cosa che scrivo - non interpretarlo come un comando di terminale, passalo invece al processo" input ".

4

^Z si traduce solo con la console a un segnale di EOF al programma quando viene digitato all'inizio di una riga. Questo è solo il modo in cui funziona la console di Windows. Non c'è "soluzione" a questo comportamento che io conosca.

+0

Quindi perché^z non viene conteggiato come un carattere quando lo metto dopo un flusso di caratteri in una riga ?? Ad esempio "abcdefg^z" restituisce solo "Ci sono 7 caratteri in ingresso" invece di 8 dopo l'input^z dopo quella linea. – caramel1995

+0

@ caramel23: Credo che la console di Windows semplicemente la ignori e non passi un personaggio al programma in esecuzione. Non so perché questo succede. –

Problemi correlati