Frage

Ich habe angefangen, " The C Programming Language " (K & R Lesen ) und ich habe einen Zweifel über die getchar() Funktion.

Zum Beispiel dieses Code:

#include <stdio.h>

main()
{
  int c;

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

Typing toomanychars + STRG + D (EOF) druckt nur t. Ich denke, dass erwartet wird, da es das erste Zeichen eingeführt ist.

Aber dann das andere Stück Code:

#include <stdio.h>

main()
{
  int c;

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

Typing toomanychars + STRG + D (EOF) druckt toomanychars.

Meine Frage ist, warum tut dies passiert, wenn ich nur einen einzigen char-Variable hat? wo gespeichert ist der Rest der Charaktere?

EDIT:

Vielen Dank an alle für die Antworten, ich beginne jetzt, es zu bekommen ... nur ein Haken:

Das erste Programm beendet, wenn gegeben STRG + D , während die zweite druckt die gesamte Zeichenfolge und dann für weitere Benutzereingabe wartet. Warum ist es für eine andere Zeichenfolge wartet und verlassen sich nicht wie das erste?

War es hilfreich?

Lösung

Es ist die Behandlung des Eingangsstroms wie eine Datei. Es ist, als ob Sie eine Datei mit dem Text „toomanychars“ geöffnet und gelesen oder ausgegeben es ein Zeichen in einer Zeit.

Im ersten Beispiel, in Ermangelung einer while-Schleife, es ist wie Sie eine Datei geöffnet und das erste Zeichen gelesen und ausgegeben es dann. Doch das zweite Beispiel wird auch weiterhin Zeichen zu lesen, bis es ein Dateiendesignal (ctrl+D in Ihrem Fall) wird genauso wie wenn es aus einer Datei auf der Festplatte gelesen hat.


In Antwort auf Ihre Frage aktualisiert, welches Betriebssystem verwenden Sie? Ich lief es auf meinem Windows XP Laptop und es funktionierte gut. Wenn ich die Eingabetaste drücken, würde es ausdrucken, was ich bisher hatte, eine neue Linie machen, und dann weiter. (Die getchar() Funktion nicht zurück, bis Sie die Eingabetaste drücken, das ist, wenn es nichts in dem Eingangspuffer ist, wenn es heißt). Wenn ich CTRL+Z (EOF in Windows) drücken, wird das Programm beendet. Beachten Sie, dass in Windows, die EOF auf einer eigenen Zeile sein muss als EOF in der Eingabeaufforderung zu zählen. Ich weiß nicht, ob dieses Verhalten in Linux nachgeahmt wird, oder welches System Sie laufen können.

Andere Tipps

getchar bekommt ein einzelnes Zeichen von der Standardeingabe, die in diesem Fall ist der Tastaturpuffer.

In dem zweiten Beispiel ist die getchar Funktion in einer while Schleife, die fortgeführt, bis er eine EOF trifft, so wird er halten Looping und ein Zeichen abzurufen (und um das Zeichen Siebdruck), bis der Eingang leer wird.

Durch wiederholtes Anrufe getchar werden aufeinanderfolgende Zeichen erhalten, die von dem Eingang kommen.

Oh, und fühle mich nicht schlecht, diese Frage zu fragen. - Ich war verwirrt, als ich zum ersten Mal auch dieses Problem aufgetreten

Etwas hier wird gepuffert. z.B. die stdout FILE *, die putchar schreibt vielleicht werden line.buffered. Wenn das Programm beendet (oder eine neue Zeile trifft) eine solche Datei * wird Fflush sein () 'ed und Sie werden die Ausgabe.

In einigen Fällen ist die tatsächliche Terminal Sie sehen möglicherweise die Ausgabe bis zu einem Newline-Puffer, oder bis das Terminal selbst angewiesen wird, spülen es Puffer ist, was der Fall sein könnte, wenn die aktuellen Vordergrund Programm beendet sincei es will präsentieren Neuabfrage.

Nun, was ist wahrscheinlich die eigentliche Fall, hier zu sein, ist, dass es ist die Eingabe ist, die (zusätzlich zu dem Ausgang :-)) gepuffert ist, wenn Sie die Tasten drücken Sie es auf Ihrem Terminal-Fenster angezeigt werden. Allerdings wird das Terminal nicht diese Zeichen auf Ihre Bewerbung senden, wird es puffern, bis Sie sie anweisen, mit Strg + D und möglicherweise ein Newline als auch die End-of-Eingang zu sein. Hier ist eine andere Version zu spielen, um und nachzudenken über:

int main() {
  int c;
   while((c = getchar()) != EOF) {
     if(c != '\n')
        putchar(c);
   }
    return 0;
}

Versuchen Sie Ihr Programm einen Satz Fütterung, und drücken Sie die Eingabetaste. Und das Gleiche tun, wenn Sie auf Kommentar if (c! = ‚\ n‘) Vielleicht können Sie feststellen, ob Ihre Eingabe, Ausgabe oder beide in irgendeiner Weise gepuffert werden. Dies wird umso interessanter, wenn Sie die oben wie ausführen: ./mytest | ./mytest

(As sidecomment, beachten Sie, dass CTRD + D kein Zeichen ist, noch ist es EOF. Aber auf manchen Systemen wird es führen den Eingangsstrom zu schließen, die wieder EOF jedem erhöhen wird versucht, aus dem Stream zu lesen.)

Ihr erstes Programm liest nur ein Zeichen, druckt es aus und beendet das Programm. Ihr zweites Programm hat eine Schleife. Es hält Zeichen einer nach dem anderen zu lesen und drucken sie aus, bis sie einen EOF-Zeichen liest. Nur ein Zeichen zu einem bestimmten Zeitpunkt gespeichert wird.

Sie verwenden nur die Variable c jedes Zeichen einer nach dem anderen zu enthalten.

Wenn Sie das erste Zeichen (t) mit putchar(c) angezeigt haben, können Sie über den Wert von c vergessen durch das nächste Zeichen (o) der Variablen c Zuordnung des vorherigen Wertes zu ersetzen (t).

der Code ist funktional äquivalent zu

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

Sie können diese Version einfacher zu verstehen, finden. der einzige Grund, die Zuordnung in den bedingten zu setzen ist zu vermeiden, ‚c = getchar ()‘ zweimal eingeben.

Für Ihre aktualisierte Frage, im ersten Beispiel, nur ein Zeichen gelesen wird. Er erreicht nie die EOF. Das Programm endet, weil es nichts für sie nach Abschluss der printf Anweisung zu tun. Es liest nur ein Zeichen. Druckt es. Versetzt in einer neuen Zeile. Und endet dann, wie es nichts mehr zu tun hat. Es ist nicht mehr als ein Zeichen lesen.

Während in dem zweiten Code, die getchar und putchar innerhalb einer while-Schleife vorhanden ist. Dabei hält das Programm auf Lese Zeichen nacheinander (wie es durch die Schleife so zu tun, hergestellt wird), bis erreicht die EOF-Zeichen erreicht (^ D). An diesem Punkt entspricht es c! = EOF und da die Bedingungen nicht erfüllt ist, kommt es aus der Schleife. Jetzt gibt es nicht mehr Anweisungen auszuführen. Also das Programm an dieser Stelle beendet.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top