getchar()



  • Hallo,

    ich habe ein Problem mit einem Beispielcode, den ich nicht verstehe. Er ist aber schön kurz:

    #include <stdio.h>
    
    int main(void)
    {
    	int c;
    	int anzahl = 0;
    	c = getchar();
    	if (c != EOF)
    
    		while (c != EOF)
    			{
    				c = getchar();
    				if (c != EOF) anzahl = anzahl + 1;
    			}
    
    	printf ("%3d", anzahl);
    	return 0;
    }
    

    Die Aufgabe lautete: Schreiben Sie unter Verwendung von getchar() ein
    Programm in C, dass zählt wie viele Zeichen vom Terminal eingelesen wurden.

    Das Programm funktioniert. EOF erzeugt man unter Windows mit "STRG+z", unter
    Linux mit "STRG+d". Nun zur Frage. In meinem Buch (C als erste Programmiersprache)
    steht folgendes:

    Aufgabe 3.5: Einlesen von Zeichen mit getchar()
    Der einfachste Eingabemechanismus besteht darin, ein einzelnes Zeichen von der
    Standard-Eingabe – normalerweise von der Tastatur – mit Hilfe von getchar() zu
    lesen. Die Syntax von getchar() ist:
    int getchar (void)
    Die Standardeingabe ist zeilengepuffert, das heißt, getchar() wartet, bis eine Zeile
    mit der Return-Taste abgeschlossen wird. Der Rückgabewert ist nicht vom Typ
    char, sondern vom Typ int.

    Warum kann diese Programm Zeichen zählen? Ich erwartete, dass es nur Zeilen
    zählt, was auch die zweite Teilaufgabe ist. Außerdem frage ich mich, warum der
    Code "so viele" (zwei if und eine while) Schleifen hat.

    An diesem Beispiel hänge ich schon länger und versuche mit ein Flussdiagramm zu
    denken, was mit aber nicht gelingt um den Ablauf nachvollziehen zu können.

    Viellicht ist jemand so gnädig ;).

    Grüße
    Tim



  • getchar() ließt ein zeichen ein.
    Das die Eingabe gepuffert wird hat hierdrauf keinen Einfluss.



  • Die Pufferung ist sozusagen intern du brauchst dir darüber keine Gedanken zu machen.



  • Hi!

    Katzenstreu schrieb:

    Warum kann diese Programm Zeichen zählen?

    Weil die Funktion getchar in einer Schleife bis zur Abbruchbedingung aufgerufen wird. D.h. solange ein Zeichen zum Einlesen im Puffer ist, wird es von von getchar 'abgeholt'.

    Katzenstreu schrieb:

    Außerdem frage ich mich, warum der
    Code "so viele" (zwei if und eine while) Schleifen hat.

    Das frage ich mich auch, es geht auch anders:

    int c = 0, i = 0;	
    	while ( ( c = getchar()) != '\n' && c != EOF )
    		i++;
    	printf ( "%d Zeichen wurden eingelesen\n", i );
    

    Gruß,
    B.B.



  • Okay. Ihr seid schnell :). Ich ignoriere die Pufferung vorläufig.

    Danke B.B., dein Code gefällt mir viel besser.
    Aber was macht das != EOF in diesem?

    Würde nicht auch

    while ( ( c = getchar() != '\n' )
    

    reichen? Denn "STRG+z" wird bei mir mit bei deinem Code nicht
    interpretiert. Nur eine neue Zeile reicht um das Ergebnis auszugeben.

    Grüße
    Tim



  • Katzenstreu schrieb:

    Danke B.B., dein Code gefällt mir viel besser.
    Aber was macht das != EOF in diesem?

    Es soll Systeme geben welche die Pufferung nicht mit einem '\n', sondern mit einem EOF abschließen (Ich gestehe, ich kenne keins).

    Katzenstreu schrieb:

    Würde nicht auch

    while ( ( c = getchar() != '\n' )
    

    reichen? Denn "STRG+z" wird bei mir mit bei deinem Code nicht
    interpretiert. Nur eine neue Zeile reicht um das Ergebnis auszugeben.
    Grüße
    Tim

    <Erbsenzähler>
    Wenn du die Klammerballance auswuchtest, dann wohl ja. :p
    </Erbsenzähler>
    Ich habe bisher nur PC Zeugs gemacht, dafür lasse ich das EOF auch immer weg.



  • Erbsenzähler ist gut ;). Entschuldige bitte, ich dachte bei
    dir wäre eine Klammerunwucht. Habe es verschlimmbessert.


Anmelden zum Antworten