Programm geht bei char Eingabe in Endlosschleife



  • Hey Leute,
    ich habe ein Problem. Und zwar soll das Programm am Anfang ja c abfragen. wenn der wert nicht 1 oder 2 ist wiederholt er das ganze auch. Wenn man aber ein Zeichen dort eingibt, kommt es gar nicht damit klar und geht in eine Endlosschleife. Ich habe das Gefühl es hat was mit dem goto zu tun, ich weiß aber nicht wie ich es anderes machen soll. Das sollte natürlich nicht passieren. Als Anmerkung muss ich sagen dass ich sehr neu bin, also verzeiht mir bitte dumme Fehler ^^

    Ich hoffe irgendwer kann mir helfen.

    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    int main()
    {
       int c=0;
       float a,b,d;
       Z:
    
       printf ("\nWaehlen sie ob sie den Flaecheninhalt (1) oder den Umfang (2) berechnen wollen \n");
    
       scanf(" %i",&c);
    
    
       switch(c) {
       case 1:
           printf("Sie berechnen nun den Flaecheninhalt!\n");
           printf ("Welchen Wert hat A ? \n");
           scanf (" %f",&a);
            printf ("Welchen Wert hat B ? \n");
           scanf (" %f",&b);
           printf("Das Ergebniss ist %f*%f=%f \n",a,b,a*b);
           break;
    
    
    
    
        ;break; case 2:
            printf("Sie berechnen nun den Umfang!\n");
           printf ("Welchen Wert hat A ? \n");
           scanf (" %f",&a);
            printf ("Welchen Wert hat B ? \n");
           scanf (" %f",&b);
           printf("Das Ergebniss ist %f+%f+%f+%f=%f \n",a,a,b,b,a+a+b+b);
           break;
    
    
        break;
    
        default:
        printf("\n\n\t!!Ihre Eingabe ist nicht gueltig waehlen sie bitte 1 oder 2!!\n");
        goto Z;
        break;
    
    
       }
        }
    
    
    


  • nein es hat nichts mit dem goto an sich zu tun, sondern damit, dass du die fehlermeldung von scanf nicht auswertest.

    aber wer hat dir erzählt, dass du goto verwenden sollst?



  • Naja gesagt hat es keiner, ich wusste nur nicht wie ich es anderes machen soll...



  • naja irgendwo musst du es ja her haben. goto ist jedenfalls etwas für sonderfälle und du solltest lieber schleifen verwenden.

    was dein eigentliches problem angeht: wenn du nach scanf() getchar() aufrufst, funktioniert es. damit ziehst du das enter-zeichen ('\n') aus dem eingabepuffer.



  • @Wade1234 sagte in Programm geht bei char Eingabe in Endlosschleife:

    wenn du nach scanf() getchar() aufrufst, funktioniert es. damit ziehst du das enter-zeichen ('\n') aus dem eingabepuffer.

    Das Enter macht aber nicht den Fehler.

    Bei einer richtigen Eingabe würde das getchar() wegen des '\n aber' auch keine Probleme machen.

    @Wade1234 sagte in Programm geht bei char Eingabe in Endlosschleife:

    , sondern damit, dass du die fehlermeldung von scanf nicht auswertest.

    Gemeint ist der Rückgabewert. der muss in diesem Fall 1 sein, wenn ein Wert eingelesen wurde.

    if (scanf(" %i",&c) != 1) {
    // hier Fehlerbehandlung einbauen
    }
    

    Oder in einer Schleife

    while (scanf(" %i",&c) != 1) {
    // hier Fehlerbehandlung einbauen
    }
    


  • @Paulchen1409 sagte in Programm geht bei char Eingabe in Endlosschleife:

    Naja gesagt hat es keiner, ich wusste nur nicht wie ich es anderes machen soll...

    Das ist normal, weil man Anfang eben so denkt. Ging mir auch nicht anders, abgesehen davon, das "goto" in QBasic in 90er Jahren nicht unbedingt schlechter Stil war. Heutzutage ist es in C++ definitiv schlechter Still.
    Also als Tipp: Immer wenn du denkst, ein "goto" wäre jetzt gut, denke noch etwas länger über das Problem nach und finde eine andere Lösung ( Schleifen, Funktionen ). 😉


Log in to reply