scanf .... verzeiht die Frage



  • Hi,
    leut ich hab mal ne Frage zu scanf, weil ich nicht ganz versteh wie des ausliest.
    Ich hab folgenden Code (als Bsp.):

    #include <stdio.h>

    int main()
    {
    char a='j';
    do
    {
    printf("Zum Abbruch (n) eingeben: \n");
    scanf("%c", &a);
    printf("%c", a);
    }while(a!='n');
    }
    [Falls man nicht n eingibt]
    Beim ersten Aufruf läuft alles wie gehabt, beim Zweiten dagegen wartet scanf() die Eingabe gar nicht mehr ab, sondern es wird der dritte Aufruf gestartet in dem scanf() die Eingabe wieder abwartet, usw. d.h. alle 'geraden' Aufrufe werden ignoriert.
    Ich weiß dass man das mit fflush(stdin); davor vermeiden kann, aber obwohl diese Methode mit meinem kleinen Beispielprogramm funktioniert, hat es in einem andern Programm, das etwas länger ist, keine Auswirkung.

    Für Hilfe wär ich echt dankbar, und sorry für diese Noob-Frage.

    Gruß r1c3



  • Ich bin nicht sicher, aber kann es sein dass du die Taste lange genug gedrückt hälst, dass beim zweiten Durchlauf ebenfalls eine Eingabe erfolgt??

    Das würde mir erklären warum bei langen Progs kein Problem auftaucht, außerdem hatte ich schon mal sowas ähnliches.

    MfG RawBurner



  • Nein ich halte die Taste nicht zu lange gedrückt.
    Ausserdem habe ich mich wohl mißverständlich ausgedrückt. Mit 'keine Auswirkung'
    meinte ich, dass fflush(stdin); das Problem bei meinem längeren Programm nicht behebt.
    Konkret geht es darum, dass die Funktion auswahl sich selber solange aufruft und jedes mal neu einlesen soll, bis einer von 4 buchstaben eingegeben wird.
    Das Problem ist eben dass in jedem geraden Aufruf, also dem zweiten, vierten, sechsten etc. Aufruf scanf() übergangen wird, es wartet nicht auf eine Eingabe.



  • das problem ist, das das enter noch im eingabebuffer steht und bei jedem zweiten schleifendurchlauf ausgewertet wird....

    fflush ist schlecht, da laut standard undefiniertes verhalten....

    zum thema scanf und buffer schau in die faq...

    mfg



  • #include <stdio.h>

    int main()
    {
    char a='j';
    char puffer;
    do
    {
    printf("Zum Abbruch (n) eingeben: \n");
    scanf("%c", &a);
    puffer = gets(); //damit hätte ich legaler weise fflush ersetzt
    printf("%c", a);
    }while(a!='n');
    }



  • gets() ist auch problematisch - und zudem falsch eingesetzt. Meine Lösung wäre die Funktion eat_line():

    #include <stdio.h>
    
    void eat_line(void)
    {
        int c;
        while ((c = getchar()) != EOF && c != '\n') ;
    }
    
    int main(void)
    {
        char a='j';
        do {
            printf("Zum Abbruch (n) eingeben: \n");
            scanf("%c", &a);
            eat_line();
            printf("%c", a);
        } while(a!='n');
    
        return 0;
    }
    

Anmelden zum Antworten