2016-07-30 10 views
2
#include <stdio.h> 
int main(){ 
    char ch; 
    while((ch=getchar())!=EOF){ 
     putchar(ch); 
    } 
    char ch2 = 'A'; 
    printf("ch2=======>%c\n",ch2); 
    ch2 = getchar(); 
    printf("ch2=======>%d\n",ch2); 
    return 0; 
} 

Ich verstehe nicht, warum es überspringt den ch2=getchar() Eingang, und ich bekomme ch2 == -1 ist der Wert von EOF. Ich habe versucht, dies zu lösen, indem ich ein weiteres getchar() vor ch2=getchar() hinzufüge, aber ich bekomme immer noch ch2 == -1. Warum ist es und wie man es repariert? Danke fürs Helfen.ch2 = getchar() funktioniert nicht nach dem letzten Eingangsschleife while ((ch = getchar())! = EOF)

Ich benutze MacOS.

+0

Warum verwenden Sie sogar EOF in diesem Beispiel? Soweit ich das sehen kann, hat dieser Code nichts mit einer Datei zu tun. –

+0

Die letzte Eingabe ist 'EOF', also wird es nicht in die Schleife gehen; –

+3

Sobald Sie das Ende der Eingabe erreicht haben, wird jeder weitere Leseversuch immer noch das Ende der Eingabe treffen. – melpomene

Antwort

0

Es gibt nichts überraschend. Ihre Schleife

while((ch=getchar())!=EOF){ 
     putchar(ch); 
} 

Auspuffe stdin vollständig. Dann printf() fügt einige Daten zu stdout, aber stdin ist immer noch leer, so dass nachfolgende getchar()EOF zurückgibt.

+1

Ja, nun, aber wenn stdin von der Tastatur eingegeben wird (wie üblich), können Sie auch nach Eingabe von Ctrl-Z normalerweise weiter tippen, und stdin ist nicht wirklich erschöpft. –

+0

@RudyVelthuis Zeitscheibe zwischen der letzten Schleifeniteration und 'ch2 = getchar();' ist so klein, dass der Benutzer sicherlich keine neuen Tastatureingaben bereitstellen kann und STDIN weiterhin als leer angesehen werden kann. – Sergio

+0

getchar() ist, AFAIK, gepuffert, so dass das Programm auf Eingabe wartet, bis jemand die Rückkehr drückt (oder wie immer die Taste aufgerufen wird). Die Zeitscheibe sollte irrelevant sein. –

1

Beim Kompilieren, aktivieren Sie immer alle Warnungen, dann beheben diese Warnungen

ich diese Version des Codes verwendet, die sauber kompiliert:

#include <stdio.h> 
int main(){ 
    int ch; 
    while((ch=getchar())!=EOF){ 
     putchar(ch); 
    } 
    int ch2 = 'A'; 
    printf("ch2=======>%c\n",ch2); 
    ch2 = getchar(); 
    printf("ch2=======>%d\n",ch2); 
    return 0; 
} 

dann eingegeben:

ddd<ctrl-d>ccc<cr> 

Dies ist das erwartete (und tatsächliche) Ergebnis:

ddd 
ddd 
ch2=======>A 
ccc 
ch2=======>99 

Anmerkungen:

1) getchar() nicht zurückkehrt, bis eine oder <cr><ctrl-d>

2) eingegeben wird, alle eingegebenen Zeichen werden von dem Terminal-Treiber echo'd (nicht das Programm)

3) Es gibt noch 2 c s und <cr> im Eingangspuffer, die nicht verbraucht wurden

+0

Verwenden Sie Linux oder MacOS, seit ich festgestellt habe, dass Sie 'Strg + D' eingegeben haben. Ich habe deinen Code auf Mac kopiert und ausgeführt. Es funktioniert nicht. Aber sowohl mein Code als auch dein Code funktionieren gut unter Windows. – Tianqing

+0

Ich wette, er benutzt Linux. –