Endlosschleife bei Buchstabe



  • Könnte mir jemand beantworten, wieso dieses Programm in einer Endlosschleife hängen bleibt, wenn ich einen Buchstaben eingebe?
    Eine ungültige Zahlenfolge wird als falsche Eingabe hingegen erkannt.

    Ich ging davon aus, dass default alle falschen Eingaben erkennt, aber dies scheint nicht der Fall zu sein.

    #include <stdio.h>
    #include <stdlib.h>

    int main(void) {
    int choice;
    do {
    printf("::::::::::::::::::::::::::::::::::::::::::::\n");
    printf(":::::::::::EASY-NETSTAT 0.1:::::::::::::::::\n");
    printf("::::::::::::::::::::::::::::::::::::::::::::\n\n");
    printf("Please choose a point from below:\n");
    printf("-1- Display Ethernet statistics\n");
    printf("-2- Display the routing table\n");
    printf("-3- Display all connections and listening ports\n");
    printf("-4- Quit\n\n");
    printf("Your choice: ");
    scanf("%d", &choice);

    switch(choice) {
    case 1 : system("netstat -e");
    break;
    case 2 : system("netstat -r");
    break;
    case 3 : system("netstat -a");
    break;
    case 4 : printf("Quit\n");
    break;
    default : printf("Invalid choice!\n\n");
    }
    } while(choice!=4);
    getchar();
    return 0;
    }



  • Such mal hier im Forum nach 'Eingabepuffer leeren'.



  • Danke 🙂

    Habe ihn jetzt mit fflush(stdin); nach dem scanf geleert

    Das bringt schonmal einiges, doch so ganz funktioniert es immer noch nicht:

    1. Gebe ich nun einen Buchstaben als erstes ein, so printet er mir immer choice 2
    2. Ich muss erst eine falsche Zahl eingeben, ansonsten erkennt er in weiteren Durchläufen Buchstaben nicht als ungültige Wahl an.

    Nochmal der Code hier sauber geposted:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int choice;
        printf("::::::::::::::::::::::::::::::::::::::::::::\n");
        printf(":::::::::::EASY-NETSTAT 0.1:::::::::::::::::\n");
        printf("::::::::::::::::::::::::::::::::::::::::::::\n\n");
        printf("Please choose a point from below:\n");
    
        do {
        printf("-1- Display Ethernet statistics\n");
        printf("-2- Display the routing table\n");
        printf("-3- Display all connections and listening ports\n");
        printf("-4- Quit\n\n");
        printf("Your choice: ");
        scanf("%d", &choice);
        fflush(stdin);
    
        switch(choice) {
             case 1 : system("netstat -e");
             break;
             case 2 : system("netstat -r");
             break;
             case 3 : system("netstat -a"); 
             break;
             case 4 : printf("Programmende\n");
             break;
             default : printf("Invalid choice!\n\n");
                       }
             } while(choice!=4);
    return 0;
    }
    


  • fflush(stdin) solltest du nicht vewenden. Das ist nur beim MS-Compiler erlaubt (und wer weiß, ob das immer so bleibt). Laut Standard ist das Verhalten undefiniert... (also nochmal suchen, bitte 😉 ).



  • rückgabewert von scanf prüfen, wenn nicht ok, erst gar nicht in die switch abfrage reinlassen



  • Selbst wenn ich vor den switch ne if-abfrage mache mit:

    if (choice ==1 || choice ==2 || choice==3 || choice==4)

    zeigt er das selbe verhalten auf.

    Er erkennt erst Buchstaben als falsche Eingabe, sobald ich eine ungültige Zahl vorher eingab.



  • 😕

    Wenn ich deinen geposteten Code ausprobiere und ein 'd' oder 'k' oder sonstwas eingebe, springt er direkt in den default-Zweig, wie gewünscht...



  • Macht er bei mir leider nur, solange ich vorher keine ungültige Zahl eingab 😞

    Kompiliert habe ich es mit Dev-C++ mit dem MinGW Compiler.

    Hier mal ein Bild:

    http://www.abload.de/img/netstat5ri9.png



  • Dann bedenke meinen vorigen Tipp zum Thema fflush(stdin), vielleicht liegt es tatsächlich daran! Das ist, soweit ich weiß, nur beim MS-Compiler (Visual Studio) erlaubt.



  • int choice = 0;



  • Mit int choice = 0; geht es, danke 🙂

    Werde das noch mit alternativen zu fflush irgendwann testen, aber da fehlt mir noch etwas das Wissen zu um diese zu verstehen.

    Danke vielmals für die Ratschläge!


Anmelden zum Antworten