"valid integral constant" bei Switch-Anweisung



  • Hallo zusammen,

    ich bin blutiger Anfänger und bekomme bei dem folgenden Code folgende Fehlermeldung: "Case expression must be a valid integral constant".
    Ziel des Programms soll es sein mit switch/case ein Menüsystem zu erzeugen, welches in den ersten beiden Fällen eine Eingabe einliest, in Fall 3 und 4 das Vorhandensein einer Produkt- bzw. Kundennummer prüft (Da gibt es bestimmt deutlich bessere Wege dies zu tun. Tipps?) und sofern vorhanden, ausgibt. Im 5. Fall soll das Programm beendet werden.

    #include <stdio.h>
    main (){
    int produktnr, kundennr, test;
    
    printf("1 = Produktnummerneingabe, 2 = Kundennummerneingabe, 3 = Produktnummernausgabe, 4 = Kundennummernausgabe, 5 = Beenden");
    scanf("%i", &test);
    
    switch (test) {
        case "1": printf ("Geben Sie eine Produktnummer ein.");
            scanf ("%i", &produktnr); 
        case "2": printf ("Geben Sie eine Kundennummer ein.");
            scanf ("%i", &kundennr); 
        case "3": if (produktnr > 0) printf("%i", produktnr); else break;
        case "4": if (kundennr > 0) printf ("i", kundennr); else break;
        case "5": printf ("Das Programm wird beendet"); break;
    
                }
    return 0;
    }
    

    Danke schon einmal im Voraus!



  • Weil es gerade im C++ Forum war:
    https://www.c-plusplus.net/forum/p2475604#2475604



  • switch (test) {
        case "1": printf ("Geben Sie eine Produktnummer ein.");
            scanf ("%i", &produktnr); 
        case "2": printf ("Geben Sie eine Kundennummer ein.");
            scanf ("%i", &kundennr); 
        case "3": if (produktnr > 0) printf("%i", produktnr); else break;
        case "4": if (kundennr > 0) printf ("i", kundennr); else break;
        case "5": printf ("Das Programm wird beendet"); break;
    
                }
    

    Das ist ja grausig 🙂 da fehlen breaks und produktnr, kundennr sind uninitialisiert in case 3 und 4.
    D.h sie können einen Wert größer 0 haben und dann wird Unfug ausgegeben.
    Das Menüsystem sollte öfter als einmal angezeigt werden also setze eine do-while Schleife darum.



  • Danke für die schnellen Antworten.

    Das wundert mich kein bisschen, dass es grausig ist. Das ist die erste Switch-Anweisung, die ich geschrieben habe :p.

    Heißt das, dass hinter jeden Case ein break kommen sollte?

    zu 3 und 4: In der Aufgabe steht, dass geprüft werden soll, ob eine Produkt- bzw. Kundennummer vorhanden ist und wenn ja, ausgegeben und ansonsten beendet werden soll. Was wäre eine bessere Lösung dafür?

    Ich kann mit dem Link nicht so viel anfangen. Was genau verursacht die Fehlermeldung?

    LG



  • Zu jedem case gehört (im Normalfall) ein break.
    Der case-Ausdruck muss ein konstanter int-Wert sein, also 1,2,3 und nicht so wie bei dir "1","2","3".



  • apollonia schrieb:

    Heißt das, dass hinter jeden Case ein break kommen sollte?

    Ja, ansonsten werden auch alle anderen case die hinter dem eigentlichem case kommen ausgeführt.

    Im Klartext:
    `

    int i=2;

    switch(i)

    {

    case 1: printf("1!");

    case 2: printf("2!");

    case 3: printf("3!");

    case 4: printf("4!");

    default: printf("ooops");

    }

    `
    Hier wäre die Ausgabe "2!3!4!" statt "2!". (Das Ausrufezeichen steht hier nicht für Fakultät sondern ist nur ein Ausrufezeichen.)

    zu 3 und 4: In der Aufgabe steht, dass geprüft werden soll, ob eine Produkt- bzw. Kundennummer vorhanden ist und wenn ja, ausgegeben und ansonsten beendet werden soll. Was wäre eine bessere Lösung dafür?

    Das Problem ist: Wenn jemand das Programm startet sind produktnr und kundennr uninitialisiert, enthalten also zufällige Werte. Wenn dann jemand die Ausgabe dieser Werte auswählt kommt Blödsinn raus, nämlich je ein zufälliger Wert wenn er >0 ist oder nichts. Da offensichtlich die Nummern positiv sein müssen kannst du ganz oben (Zeile 3) die Variablen mit einem negativen Wert initialisieren, dann ist sicher das am Anfang ein ungültiger Wert (<0) drin ist der nichts ausgegeben wird, bis halt jemand einen gültigen (>0) Wert eingibt.

    Nebenbei, einem deiner printfs fehlt ein %, das sollte der Compiler anmeckern. Wenn nicht Warnungen aktivieren! (im GCC: -Wall als zusätzlicher Parameter).

    Ich kann mit dem Link nicht so viel anfangen. Was genau verursacht die Fehlermeldung?

    Der Link ist eigentlich recht eindeutig. Kurzfassung: "1" ist eine Zeichenkette, 1 ist eine Zahl. Du willst Zahlen, also sind die Anführungszeichen falsch.

    Achte auf eine ordentliche Formatierung des Codes, das macht die Fehlersuche (bzw. Vermeidung) einfacher. Der Code in einem case darf beliebig viele Zeilen lang sein.


Log in to reply