Irgendeine Idee, warum der folgende Code die Anzahl der Zeichen in der Eingabe nicht ausgibt? Ich habe das direkt aus dem K & R-Buch übernommen. C im Moment zu lernen und das ist wirklich verwirrend, sieht für mich so aus, als würde ich nie EOF erreichen. Wenn das der Fall ist, warum sollte das dann als Beispiel dienen?
%Vor% Das Programm sieht korrekt aus. Ihr Problem ist, dass Sie EOF
(End-of-File) nach Ihrer Eingabe an die Befehlszeile senden müssen, da die Standardeingabe als Datei behandelt wird. Ich denke, in einem Linux-Terminal können Sie Strg + D drücken, um EOF
zu senden ... Ich bin nicht sicher, wie es in anderen Betriebssystemen funktioniert. Um dieses Programm zu testen, können Sie EOF
in '\n'
ändern, wodurch es beim Drücken der Eingabetaste angehalten wird.
Das Programm liest Daten von stdin
bis EOF
ein, indem Sie Strg-D am Anfang einer Zeile auf einer Unix-Konsole oder Strg-Z am Anfang einer Zeile in einem Windows drücken Konsole. Nachdem Sie EOF
auf diese Weise signalisiert haben, wird die Funktion printf
ausgeführt, die die Anzahl der gelesenen Zeichen anzeigt.
Ich möchte die Antworten, die bisher gegeben wurden, klarstellen, weil sie Ausdrücke wie "send EOF", "empfangene EOF", "EOF-Zeichen" usw. zu verwenden scheinen. Laut Kommentare (danke) zu dieser Antwort, "sende EOF "und" empfangene EOF "sind legitime Begriffe, aber denken Sie bitte nicht, dass es ein Charakter ist.
EOF ist überhaupt kein Charakter. Es ist der Wert, den getchar () (oder fgetc / getc) zurückgibt, wenn der Datenstrom am Ende der Datei liegt oder ein Lesefehler auftritt. Es ist lediglich ein spezieller Wert außerhalb des Bereichs von Zeichenwerten, den getchar () zurückgibt, der die Bedingung des Fehlers oder das Dateiende angibt.
Er wird vom C-Standard als negativ definiert, während getchar Zeichen als unsigniertes Zeichen zurückgibt, das in int konvertiert wurde.
Edit: Wenn ich etwas recherchiert habe, was ich vor dem Absatz gemacht haben sollte, der früher hier war, habe ich festgestellt, dass einige meiner Annahmen völlig falsch waren. Danke an den Kommentator für das Aufzeigen.
Sobald ein Datenstrom (z. B. stdin) in der End-of-File-Bedingung ist, kann diese Bedingung mit clearerr () wieder gelöscht werden und getchar () liest möglicherweise mehr Daten von stdin.
Dieser Code liest Zeichen aus der Standardeingabe. Wenn Sie dieses Programm normal ausführen, stammt die Standardeingabe vom Benutzer. In diesem Fall gibt es keine Möglichkeit, EOF an das Programm zu senden.
Dieser Code funktioniert, wenn Sie eine Datei auf den Standard in (./myprogram & lt; tempfile.txt) umleiten.
Zuerst müssen Sie, wie bereits erwähnt,% lf anstelle von% d verwenden, um das Double anzuzeigen, andernfalls wird nur die ganze Zeit Null angezeigt (d steht für eine ganze Zahl mit Vorzeichen). Wenn Sie dies manuell auf einem Windows-basierten Betriebssystemtyp in einigen Zeichen testen möchten, drücken Sie die EINGABETASTE und dann STRGZ in der nächsten Zeile ganz von selbst (dies simuliert das EOF). Das Druckergebnis wird um eins mehr als die Anzahl der Zeichen (es enthält die CtrlZ). Auch als SoapBox bei der Suche nach einem EOF angezeigt wurde, war das Denken damals meist Unix, wo man eine Datei über Standardeingabe in das Programm pipete, das würde auch funktionieren.
Tags und Links c kernighan-and-ritchie