C Programmierübung aus dem K & R Buch

7

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%     
Deduplicator 05.12.2008, 01:20
quelle

6 Antworten

12

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.

    
Jeremy Ruten 05.12.2008, 01:26
quelle
7

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.

    
Robert Gamble 05.12.2008 01:25
quelle
6

Ihr nc ist ein doppelt verwendbares printf("%lf", nc) zum Drucken von Doppelbildern.

Versuchen Sie es stattdessen

%Vor%     
EvilTeach 05.12.2008 01:39
quelle
5

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.

    
Chris 05.12.2008 02:46
quelle
1

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.

    
SoapBox 05.12.2008 01:24
quelle
0

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.

    
daduffer 05.12.2008 06:55
quelle

Tags und Links