Anfänger braucht hilfe zu getchar()



  • HALLO,
    ich bin neu in C/C++,
    kann aber schon BB und PHP.
    Jetzt hab ich eine Frage zu folgendem Code:

    #include <stdio.h>
    
    main()
    {
    char c;
    c=getchar();
    putchar(c);
    c=getchar();
    putchar(c);
    c=getchar();
    putchar(c);
    }
    

    1.Warum wird nur 1*abgefragt?Ich hab doch 3*getchar()
    2.Warum wird der text nicht mehr ausgegeben?Ich hab doch putchar(),oder ist das für was anderes zuständig?
    3.Warum kann man in die Char Variable c gleich mehere Zeichen einlesen?Ich denke jedenfalls das das eigelesen wird da man ja mehrere zeichen im Programm eingeben kann.Oder wird c immer überschrieben,also ist nur das letzte zeichen der eingabe in c?

    Hoffe das mir jemand meine Fragen mit Erklärung beantworten kann.

    Danke
    Xalon



  • ausser dem eingegebenen zeichen befindet sich noch das zeichen für die 'return' taste im eingabepuffer. deshalb hat das zweite getchar scheinbar keine wirkung



  • Du kannst das "Neue-Zeile-Zeichen" (enter) rausfiltern :

    /*...*/
    c = getchar();
    while((c = getchar()) != '\n'){;}
    putchar(c);
    /*...*/
    


  • Hi,

    zu 1.)
    Es wird 3* "abgefragt". Beim ersten mal gibst du ein zeichen ein und
    bestätigst mit return. Das Zeichen für ruturn (fluchtsequenyz '\n') wird
    dann aber schon bei der 2. Abfrage als Eingabe aufgefasst und springt zur 3. .

    zu 2.)
    Der Text wird ausgegeben, die '\n'´s siehst du natürlich nicht.
    Gib doch mal
    - a, enter, b ein, oder 3* enter

    zu 3.)
    Du kannst zwar mehrere Zeichen auf der Tastatur eingeben, diese werden aber
    nicht an die Adresse der Variablen im Speicher geschrieben, sondern zunächst
    in einen Tastaturpuffer/Cache geschrieben. Beim bestätigen mit Enter arbeiten
    dann die von der Tastatur lesenden Funktionen den Puffer ab. Es werden also
    bei Eingaben > 3 Zeichen immer nur die ersten 3 genommen und die Variable
    überschrieben.

    Tipp:

    Um das Enter-Zeichen im Tastaturpuffer zu löschen setzt du nach jedem
    getchar() ein

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

    oder ein

    fflush(stdin);
    

    Das bewirkt ein "entleeren" des Tastaturpuffers bis zum '\n'.

    Hoffe das hilft dir

    b4sh0r



  • Xalon schrieb:

    Jetzt hab ich eine Frage zu folgendem Code [...]

    In Bezug auf getchar() haben meine Vorredner schon einiges gesagt. Hier noch ein wenig Formales. Der Rahmen eines C-Programms sollte so aussehen (falls keine Argumente an main() übergeben werden sollen):

    int main(void)
    {
        /* code */
    
        return 0;
    }
    

    [...] Oder wird c immer überschrieben, also ist nur das letzte Zeichen der Eingabe in c?

    So ist es. ein Variable vom Typ char fasst genau ein Zeichen, aber solange die (char) Variable nicht als const (Konstante) deklariert ist, kannst Du sie natürlich auch "überschreiben".

    Bsp:

    char c;
    c = 'a';

    // c enthält das Zeichen 'a'

    c = 'b';

    // c enthält nun das Zeichen 'b'



  • Danke,jetzt hab ichs kapiert.

    Xalon



  • Das bewirkt ein "entleeren" des Tastaturpuffers bis zum '\n'.
    

    Nope. Das Bewirkt gar nichts. fflush() ist nur für das entleeren von Ausgabe-Streams. Das flushen von Eingabe-Streams ist undefiniert (steht auch in der FAQ)

    Und dann fällt mir noch auf, dass getchar() eigentlich eine int zurückliefert. Ihr benutzt aber eine char-variable. Das könnte zum Problem wenn man nachher vielleicht auf EOF prüfen möchte.

    Jetzt noch was generelles: stdout ist meistens ein gepuffertet stream. Ihm eueren Fall ist der stream, da er mit einem Terminal (Dos-Fenster) verbunden ist, sogar line-gepuffert[1]. Das heißt, der stream wird entweder geflusht wenn ein new-line-character ('\n') geschrieben wird oder es explizit gefordert wird[2].

    Ich würde sagen, dass die stdc-library eigentlich ungeignet ist ein benutzerfreundliches user-interface zu erstellen. Dafür gibt es libraries wie (n)curses

    mfg

    --
    [1] schreckliche Übersetzung..
    [2] zB mit fflush()


Anmelden zum Antworten