scanF / fgets / switch ( Consolen Menusteuerung ) klappt net !



  • Hallo liebes Forum,

    Ich beschäftige mich seit kurzem mit C. Der folgende Code-Abschnitt bewirkt nicht was er soll aber Fehler werden nicht erkannt, oder liegt es an dem Compiler in Microsoft Visual C++ 2010?
    Der Code ist kommentiert und sollte selbst erklärend seien:

    void ConInF () // Funktion für die Menu-Steuerung ; Eingabe; switch Verzweigung
    {	int ConIn;
    	scanf("%d",&ConIn);
    	fflush(stdin);
    
    	switch (ConIn) {
    		case 1: printf ("Now You leave the App"); Sleep (5000); return 0; break;
    case 2
    ...
    

    eigentlich sollte die Variable mit char deklariert werden:

    char ConIn [10];
    	ConIn = "default";
    	fgets (ConIn, 10, stdin)
    
    switch (ConIn){
    case "Exit": ...
    ...
    

    Beide Varianten funktioniern nicht es wird immer default ausgeführt.
    Mach ich das richtig mit der switch Anweißung? Kann man das so schreiben mit 'case "Exit"' und die Abfolge der Befehle immer mit ';' trennen oder anders?

    lg Tom


  • Mod

    Tom. schrieb:

    oder liegt es an dem Compiler in Microsoft Visual C++ 2010?

    Fehler liegen (fast) nie am Compiler. Erst Recht keine Anfängerfehler.

    Deine Variante 2 ist, ...naja..., völliger Müll. Du machst da so ziemlich alles falsch was man falsch machen kann. Das man switch nur mit integralen Typen benutzen kann ist da der kleinste Fehler.

    Die Variante 1: Sieht an sich richtig aus, wenn man die ganzen fehlenden Klammern ergänzt und das undefinierte Verhalten durch Sachen wie fflush(stdin) übersieht.



  • Zum ersten Beispiel:
    Schon mal nach dem scanf ein

    printf("Sie haben %d gewählt,\n",ConIn);
    

    gemacht?

    Warum gibst du mit return 0 etwas zurück wenn deine Funktion vom Typ void ist?
    Ansonsten fällt mir dort nichts auf. (Außer fflush(stdin);)

    Das zweite Beispiel geht gar nicht!

    Die Zuweisung eines String auf ein Array geht in C nicht.
    Dafür gibt es strcpy().

    switch kann nur mit Integertypen umgehen (int, long, short, char).
    Wenn du das machen willst brauchst du if-else-if Ketten mit strcmp().

    Das ; trennt nicht, sondern schließt Befehle ab.



  • ok danke für die ersten tipps.

    dann werde ich meine menu-steuerung jetzt mit if machen.
    Ich habe meinen skript nun überarbeitet:

    void Navi() {
        printf("\nPlease navigate by keying in the following Keywords and pressing Enter: \n\n  Run  - Run the Skript \n  Stop - Stop the Skript \n  Exit - Exit the App \n  Info - Informations about the application and it's use\n\n>>> ");
    }
    
    void ConInF () { // Funktion für die Menu-Steuerung ; Eingabe; If Verzweigung
    	char ConIn [10];
    	ConIn = "default"; // eigentlich überflüssig
    	fgets (ConIn, 10, stdin);
    
    	if (ConIn == "Exit") {
    		printf ("Now You leave the App");
    		Sleep (2000);
    		; // was ist der befehl um den skript zu beenden?
    	}
    	else if (ConIn == "Info") {
    		printf ("This App was written by Tom and realesed and produced in 2011.\n");
    		Navi();
    		ConInF();
    	}
    	else if (ConIn == "Run") {
    		printf ("Now the skript is running."); 
    			// Skript 
    		Navi() 
    		ConInF()
    	}
    	else if (ConIn == "Stop") {
    		printf ("You paused the skript."); 
    			// Skript
    		Navi()
    		ConInF()
    	}
    	else {
    		printf("\nWrong Input\n");
    		Navi();
    		ConInF();
    	}
    }
    
    int main()
    

    klappt leider immer noch nicht. -.-'
    Es wird immer 'else' ausgeführt.
    ich bin unsicher ob ich mehr als ein else if nutzen kann und ob die bedingungen z.B. '(ConIn == "Stop")' richtig ist und erkannt wird.



  • ⚠ Zuweisen von Zeichenketten geht mit strcpy(ziel, quelle)

    strcpy(ConIn, "default");
    

    ⚠ Für den Vergleich von Zeichenketten gibt es strcmp(str1, str2)
    strcmp gibt bei Gleichheit 0 zurück.

    Beachte: "EXIT" ist ungleich "Exit", da Groß- Kleinschreibung unterschieden wird.

    if (strcmp(ConIn,"Exit") == 0) {
    ...
    else if (strcmp(ConIn,"Info") == 0) {
    ...
    


  • das war ja schnell und gut beantwortet und keine kommentare wie schlecht ich im programmieren bin.

    thx



  • Ich denke es ist aber angenehmer für den Anwender wenn er nur 1, 2 oder 3 drücken muss, statt immer "Exit" oder "Info" einzutippen.

    Das Problem das du geschildert hast, lag jedenfalls nicht in dem Stück Code das du gepostet hast.
    Es ist besser wenn du nur ein kurzes lauffähiges Programm hast, in dem der Fehler auftaucht.
    Sonst raten alle nur in ihren Glaskugeln.


Anmelden zum Antworten