Einleseprozedur hängt in Schleife fest



  • Hey, ich versuche gerade ein Unterprogramm zu schreiben, dass den Benutzer bei falscher Eingabe so lange auffordern soll etwas einzugeben bis es brauchbar ist :). Ich habe gelesen dass scanf einen Wert zurück gibt, ob die Eingabe fehlerhaft war oder nicht, was ich mir hier zu nutze machen möchte. Leider bleibe ich bei falscher Eingabe immer in einer Schleife hängen, also wenn ich z.B. "Aaa" eingebe - komme ich in eine Endlosschleife, dabei sollte doch das Programm wieder bei scanf stoppen und erneut einlesen? Was mache ich falsch?

    #include <stdio.h>
    
    int main(){
        
        int Z;
        Z = eingabe();
        printf("Die Zahl ist: %d", Z);
    }
    
    int eingabe(){
        
        int test = 0;
        int zahl = 0;
        printf("Geben Sie eine ganze Zahl ein: ");
        
        test = scanf("%d", &zahl);
        
        if (test != 1){
            printf("Eingabe fehlgeschlagen!\n");
            eingabe();
        }
            else
                return zahl;
    }
    


  • Ich habe gelesen dass scanf einen Wert zurück gibt, ob die Eingabe fehlerhaft war oder nicht

    scanf liefert die die Anzahl der erfolgreich gelesenen Eingaben. Das ist eine Zahl, kein bool. In deinem Fall mit einer einzulesenden Zahl macht das keinen Unterschied, aber wenn du 2 oder mehr Dinge liest, dann schon.

    Dein Problem ist, dass die inkorrekte Eingabe immer noch im Eingabestrom ist, weil sie noch nicht verarbeitet wurde. Du musst die Eingabe leeren oder z.B. bis zum Ende der Zeile einlesen.

    Das kannst du z.B. so tun: while((c = getchar()) != '\n' && c != EOF) /* empty loop body */;
    wobei natürlich (Achtung!) c ein char int ist.
    Siehe auch http://c-faq.com/stdio/stdinflush2.html



  • @ShrimpMan Den rekursive Aufruf von eingabe() (Zeile 20) solltest du auch nochmal überdenken.
    Zumal da der Rückgabewert nicht ausgewertet wird.

    Besser ist da eine Schleife.

    eingabe ist der blöde Name für die Funktion.



  • @DirkB habe jetzt eine do While Schleife verwendet, was meinst du damit, dass der Rückgabewert nicht ausgewertet wird, er gibt mir doch eine Zahl zurück?



  • @wob Danke schön für die Zeile, jetzt funktioniert alles.

    #include <stdio.h>
    
    int eingabe();
    
    int main(){
        
        int Z;
        Z = eingabe();
        printf("Die Zahl ist: %d", Z);
    }
    
    int eingabe(){
        
        int clear, fehler, zahl;
    
        do{
            printf("Geben Sie eine ganze Zahl ein: ");
            fehler = scanf("%d", &zahl);
            while((clear = getchar()) != '\n' && clear != EOF);
        }while(fehler != 1);
    
        return zahl;
    }
    


  • @ShrimpMan sagte in Einleseprozedur hängt in Schleife fest:

    @DirkB habe jetzt eine do While Schleife verwendet, was meinst du damit, dass der Rückgabewert nicht ausgewertet wird, er gibt mir doch eine Zahl zurück?

    In deinem Ursprungscode stand

    if (test != 1){
            printf("Eingabe fehlgeschlagen!\n");
            eingabe();   // hier wird nur die Funktion aufgerufen. der Rückgabewert wird verworden.
        }
    

    zahl wird da nicht mehr verändert.



  • @ShrimpMan sagte in Einleseprozedur hängt in Schleife fest:

    Danke schön für die Zeile, jetzt funktioniert alles.

    Wenn du wirklich mal ein EOF (End of File) bekommst, wird das do-while eine Endlosschleife.


Anmelden zum Antworten