2017-10-02 2 views
1

ich diesen Code schrieb:Wert von EOF unter Windows

#include <stdio.h> 

int main() { 
    int c; 

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

    return 0; 
} 

Unter-Fenster, ich herausgefunden, dass ich zur Eingabe von Strg + Z haben, damit ich das Programm beenden, kann ich auch den Wert von EOF gedruckt und es ist -1. Wenn ich jedoch -1 anstelle von Strg + Z eingeben, wird das Programm weiterhin ausgeführt, und ich möchte verstehen, warum. Vielen Dank!

+1

Sie meinen "-1" als Text eingeben, was zwei Zeichen ergibt, ein ''-' 'und ein' '1''? –

+0

@StephanLechner Ja, das ist es. –

+0

Verwenden Sie 'atoi()' (oder 'atof()' für float) aus dem 'libmath' – YaatSuka

Antwort

3

Eingabe "-1" als Text nicht dem ganzzahligen Wert -1 aber zwei Zeichen zurück, das heißt ein '-' (die ASCII-Wert entspricht 45) und ein '1' (die ASCII-Wert entspricht 49). Beide vergleichen nicht gleich EOF (das ist -1 in Dezimal).

Per Definition können Sie nichts eingeben, das als negativer Wert von getchar() verbraucht wird, da negative Werte definiert sind, um das "Dateiende" darzustellen.

Wenn Sie einen ganzzahligen Wert lesen in möchten (wie -1), verwenden scanf:

int num; 
if (scanf("%d", &num)==1) { // successfully read one valid integral value? 
    printf("you entered number %d:", num); 
} 
+0

Also wie kann ich negative ganze Zahlen eingeben? –

+4

@ う ち わ 密 か EOF ist kein Zeichen, es ist ein Zustand des Dateistroms. Ich werde Ihrem Programm als EOF-Konstante gemeldet, aber es ist kein Zeichen, das Sie eingeben. Beachten Sie, dass Sie es bei Windows mit ctrl-z signalisieren, aber bei Linux ist es ctrl-d. – Blastfurnace

+0

@Blastfurnace, insbesondere, wenn die Windows-Konsole im Line-Input-Modus ist, eine Zeile liest über 'ReadFile', die mit Strg + Z beginnt, dass 0 Bytes gelesen worden sind, die Bibliotheken und Programme als EOF interpretieren. Also unter Windows musst du Strg + Z, Enter eingeben, während es auf Linux nur Strg + D ohne Enter ist. Dieses Verhalten ist nicht für die alternative 'ReadConsole' -Funktion implementiert, aber es kann tatsächlich verwendet werden, um stattdessen eine mehr Unix-ähnliche Strg + D zu implementieren. Auf einer höheren Ebene behandelt das Standard-I/O der C-Laufzeit das Lesen von Strg + Z ("\ x1A") als EOF aus jeder Textmodusdatei, nicht nur der Konsole. – eryksun

-1

Sie müssen die Logik nur ein bisschen ändern:

#include <stdio.h> 
int main() { 
int c; 
int done = 0; 

while (!done) 
{ 
    c = getchar(); 
    if(c != '-') 
     putchar(c); 
    else 
    { 
     c = getchar(); 
     if (c == '1')//this is an EOF 
     { 
      done = 1; // and probably putchar the EOF 
     } 
     else 
     { 
       putchar('-'); 
       putchar(c); 
     } 
    }//else 
}//while 
return 0; 

}

+1

Warum möchten Sie das tun? Die Eingabe von "-1" soll * nicht auslösen * und die Dateiende-Bedingung auslösen. Die Frage lautete: "Warum macht es das nicht?", Nicht "Wie mache ich das?". –

+0

Sie haben den Typ 'int' korrekt verwendet, aber 'EOF' kommt nicht als zwei separate Zeichen an. Deshalb ist der Rückgabewert von 'getchar'' int' nicht 'char'. –

+0

Die Frage impliziert, dass er "-1" eingeben und sich so wie die Strg-z verhalten soll. Das wird das zulassen (warum die Down-Abstimmung?). Die angenommene Antwort ist ebenfalls gut, geht jedoch davon aus, dass nur Zahlen eingegeben werden. Die Frage beschreibt nicht die Arten der Eingabe, die sie erwarten, also nehme ich an, dass es hauptsächlich Textzeichen (anstatt numerisch) ist. Ohne diese Information liefern die Antworten nur eine Vermutung darüber, was gewünscht ist. –

1

Wenn ich -1 anstelle von Strg + Z eingeben, wird das Programm weiterhin ausgeführt, und ich möchte verstehen, warum

Weil "-1" als "-" und "1" interpretiert wird und nicht als kompakter Eingang. Deshalb können Sie es nicht mit Ihrem Code erfassen.

1

Die getchar() Funktion gibt entweder den numerischen Wert des Zeichens, das gerade eingegeben wurde (als unsigned char behandelt, so dass es nie negativ), oder der besondere Wert EOF, die anzeigt, dass es nicht mehr eingegeben wird.

Windows verwendet Control-Z zum Triggern und zum Ende der Datei, wodurch getchar() den Wert EOF zurückgibt. Aber EOF ist kein Zeichenwert; Es wurde speziell ausgewählt, um ein Wert zu sein, der kein Zeichenwert sein kann.

End-of-File ist eine Bedingung, kein Wert. EOF ist ein numerischer Wert, aber kein Zeichenwert; Es ist der Wert, der von getchar() zurückgegeben wird, um anzuzeigen, dass sich die Eingabe in einem Dateiende-Zustand (oder einem Fehlerzustand) befindet.

(Wenn Sie ganzzahlige Werte lesen wollen, positiv oder negativ, benötigen Sie ein einzelnes Zeichen in einer Zeit, zu lesen und dann den Integer-Wert berechnen, dass die Zeichenfolge dar. Der Integer-Wert -1 kann als Zeichen '-' eingegeben wird gefolgt von dem Zeichen '1'. C hat verschiedene Funktionen, wie atoi und die *scanf Familie, die diese Umwandlung tun kann.)

+0

Gut gemacht. Dies ist die wirkliche Antwort auf die Verwirrung von OP. –

0

EOF ist kein 'Wert'. Es ist ein Sentinel definiert durch die stdio Bibliothek.

Ctrl/z ein Tastenanschlag, dass durch den Terminal-Treiber interpretiert wird und bewirkt, dass es Ende Strom zur Applikation von ihm zu lesen, melden, die read() verursacht C Null zurückzukehren, die getchar() EOF zurückzukehren verursacht.

Der entsprechende Tastenanschlag unter Unix, Linux usw. ist Ctrl/d.