`getchar()` liefert dieselbe Ausgabe wie der Eingabestring

Lesezeit: 5 Minuten

Benutzeravatar von Shubham
Schubham

Ich bin verwirrt durch ein in K&R erwähntes Programm, das verwendet getchar(). Es gibt die gleiche Ausgabe wie die Eingabezeichenfolge:

#include <stdio.h>

main(){
    int c;
    c = getchar();
    while(c != EOF){
         putchar(c);
         c = getchar();
    }
}

Warum wird die ganze Zeichenfolge gedruckt? Ich würde erwarten, dass es ein Zeichen liest und erneut nach der Eingabe fragt.

Und werden alle Zeichenfolgen, die wir eingeben, mit einem EOF abgeschlossen?

  • Ist EOF kein Char-Wert und kein Int?

    Benutzer379888

    9. September 2010 um 13:18 Uhr

  • Ich denke, es ist ein Int, dessen Wert -1 ist.

    – Schubham

    9. September 2010 um 13:19 Uhr

  • Zeichenfolgen werden mit \0 abgeschlossen. Dateien werden mit EOF abgeschlossen, was -1 ist

    Benutzer379888

    9. September 2010 um 13:23 Uhr

  • Ich habe eine Textdatei geöffnet, aber ich habe kein EOF am Ende gesehen. 🙂 Unabhängig davon könnte man sich eine Implementierung von C einfallen lassen, bei der EOF -42 ist, wenn man wollte … es spielt keine Rolle, wie EOF in Bezug auf einen Wert definiert ist. Sie sollten immer die Konstante verwenden.

    – Timotheus

    9. September 2010 um 13:31 Uhr


  • @Fahad: Dateien werden natürlich an ihrem Ende beendet, nicht durch das Vorhandensein eines bestimmten Werts an einer bestimmten Position in der Datei. Und der Wert von EOF ist, was auch immer die Implementierung will (normalerweise -1; aber immer EOF)

    – pmg

    9. September 2010 um 13:34 Uhr

Benutzeravatar von Erich Kitzmüller
Erich Kitzmüller

In der einfachen Einrichtung, die Sie wahrscheinlich verwenden, getchar arbeitet mit gepuffert Eingabe, also müssen Sie die Eingabetaste drücken, bevor getchar etwas zu lesen bekommt. Zeichenfolgen werden nicht mit abgeschlossen EOF; tatsächlich, EOF ist nicht wirklich ein Zeichen, sondern ein magischer Wert, der das Ende der Datei anzeigt. Aber EOF ist nicht Teil der gelesenen Zeichenfolge. Es ist was getchar kehrt zurück, wenn nichts mehr zu lesen ist.

  • Als ich das Count-Char-Programm in K&R ausprobierte, fand ich das get char() bekommt meine Eingabe wie “abc”, beim Zählen wäre es 4 Anstatt von 3also habe ich verwendet gdb Um es zu debuggen, stellte sich heraus, dass das zusätzliche ‘Zeichen’ (nl) ist, dessen ASCII-Code 0x0a ist. War meine Eingabe also ein String? Wurde diese Zeichenfolge nicht mit ‘\0’ abgeschlossen? Warum gab es ein (nl)?

    – ray6080

    26. August 2014 um 3:32 Uhr

  • Das liegt daran, dass das Zeilenvorschubzeichen, das die Zeile beendet, Teil der Eingabe ist. C ist so, kümmere dich darum.

    – Erich Kitzmüller

    26. August 2014 um 6:32 Uhr

Benutzeravatar von Timothy
Timotheus

Es gibt einen zugrunde liegenden Puffer/Stream, der getchar() und Freunde lesen vor. Wenn Sie Text eingeben, wird der Text irgendwo in einem Puffer gespeichert. getchar() kann ein Zeichen nach dem anderen durchströmen. Jeder Lesevorgang gibt das nächste Zeichen zurück, bis es das Ende des Puffers erreicht. Der Grund, warum es Sie nicht nach nachfolgenden Zeichen fragt, ist, dass es das nächste aus dem Puffer abrufen kann.

Wenn Sie Ihr Skript ausführen und direkt etwas eingeben, werden Sie weiterhin zur Eingabe aufgefordert, bis Sie drücken STRG+D (Ende der Datei). Wenn du es so nennst ./program < myInput wo myInput ist eine Textdatei mit einigen Daten, die es bekommen wird EOF wenn es das Ende der Eingabe erreicht. EOF ist kein Zeichen, das im Stream vorhanden ist, sondern ein Sentinel-Wert, der anzeigt, wann das Ende der Eingabe erreicht wurde.

Als zusätzliche Warnung, glaube ich getchar() wird auch wiederkommen EOF Wenn ein Fehler auftritt, sollten Sie dies überprüfen ferror(). Beispiel unten (nicht getestet, aber Sie bekommen die Idee).

main() {
    int c;
    do {
        c = getchar();
        if (c == EOF && ferror()) {
            perror("getchar");
        }
        else {
            putchar(c);
        }
    }
    while(c != EOF);
}

  • Danke für die STRG+D-Info.

    – estrar

    28. Januar 2014 um 16:14 Uhr

  • Erstellt ‘bash’ den Puffer oder Linux? Es scheint seltsam, dass K&R dieses Problem nicht erwähnt hat, zumal sie Unix-basiert waren. Vielen Dank.

    – Ron

    20. Juli 2016 um 19:45 Uhr

Benutzeravatar von pmg
pmg

Saiten, von C Definition, werden durch beendet '\0'. Du hast kein "C strings" in deinem Programm.

Ihr Programm liest Zeichen (gepuffert bis ENTER) von der Standardeingabe (der Tastatur) und schreibt sie zurück auf die Standardausgabe (den Bildschirm). Dies geschieht unabhängig davon, wie viele Zeichen Sie eingeben oder wie lange Sie dies tun.

Um das Programm zu stoppen, müssen Sie angeben, dass die Standardeingabe keine Daten mehr enthält (hä?? wie kann eine Tastatur keine Daten mehr haben?).

Sie drücken einfach Strg+D (Unix) bzw Strg+Z (Windows), um vorzugeben, dass die Datei ihr Ende erreicht hat.
Strg+D (oder Strg+Z) sind nicht wirklich Zeichen in der C Sinn des Wortes.

Wenn Sie Ihr Programm mit Eingabeumleitung ausführen, wird die EOF ist das eigentliche Dateiende, kein Scheinende
./a.out < source.c

Benutzeravatar von Petros
Petros

getchar() liest ein einzelnes Zeichen der Eingabe und gibt dieses Zeichen als Wert der Funktion zurück. Wenn beim Lesen des Zeichens ein Fehler auftritt oder das Ende der Eingabe erreicht ist, getchar() gibt einen speziellen Wert zurück, dargestellt durch EOF.

Benutzeravatar von Revanth Kumar
Revanth Kumar

Nach der Definition von getchar(), liest es ein Zeichen von der Standardeingabe. Leider stdin wird mit Tastatur verwechselt, was möglicherweise nicht der Fall ist getchar. getchar verwendet einen Puffer als stdin und liest jeweils ein einzelnes Zeichen. In deinem Fall gibt es da keine EOFdas getchar und putchar laufen mehrfach und es sieht für Sie so aus, als würde der ganze String auf einmal ausgedruckt. Nehmen Sie eine kleine Änderung vor und Sie werden verstehen:

putchar(c);
printf("\n");     
c = getchar();

Betrachten Sie nun die Ausgabe im Vergleich zum ursprünglichen Code.

Ein weiteres Beispiel, das Ihnen das Konzept von erklärt getchar und gepuffert stdin :

void main(){
int c;
printf("Enter character");
c = getchar();
putchar();
c = getchar();
putchar();
}

Geben Sie im ersten Fall zwei Zeichen ein. Das zweite Mal wann getchar läuft Geben Sie irgendein Zeichen ein? NEIN aber trotzdem putchar funktioniert.

Dies bedeutet letztendlich, dass es einen Puffer gibt, und wenn Sie etwas eingeben und auf die Eingabetaste klicken, wird dies im Puffer gespeichert. getchar verwendet diesen Puffer als stdin.

1410060cookie-check`getchar()` liefert dieselbe Ausgabe wie der Eingabestring

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy