Switch Case Anweißung



  • Hallo, habe hier folgendes Programm.

    Es soll wenn ich x, o, d, X, O, D eingebe verschiedene Eingabeaufforderungen liefern. Z.b. bei X || x soll ich eine Hex zahl eingeben können.

    Allerdings funktioniert das irgendwie nicht...

    #include <stdio.h>
    
    int main(void)
    {
    	char auswahl;
    	char zahl;
    
    	printf("Wollen Sie eine (O)ktal-, eine He(x)adezimal- oder eine(D)ezimal-Zahl eingeben: ");
    	scanf("%c", &auswahl);
    
    	switch(auswahl)
    	{
    	//case 'X':
    	case 'x': //'x'||'X':
    		printf("Hexadezimalzahl eingeben: ");
    		scanf("%c",&zahl);
    		printf("Die Eingabe war: %x ", zahl);
    		break;
    	//case 'O': //'o'||'O':
    	case 'o':
    		printf("Oktalzahl eingeben: ");
    		scanf("%c", &zahl);
    		printf("Die Eingabe war: %o ", zahl);
    		break;
    	//case 'D': //'d'||'D':
    	case 'd':
    		printf("Dezimalzahl eingeben: ");
    		scanf("%c",&zahl);
    		printf("Die Eingabe war: %d ", zahl);
    		break;
    	}
    
    	return 0;
    }
    

    er springt zwar in die richtigen Cases rein aber gibt mir gleich beide printfs aus ohne das ich die zahl eingeben kann. Was ist falsch?



  • scanf("%c",...) liest das nächste Zeichen aus dem Eingabepuffer und schreibt es in die übergebene Datei - da du die erste Eingabe vermutlich (ziemlich sicher) mit ENTER beendet hast, dürfte noch ein \n im Puffer stehengeblieben sein, das im switch() gelesen wurde.

    (lass mich raten: Das Programm gibt 13(d) aus)

    Zu Lösung solltest du zahl als int-Variable deklarieren und dann mit den richtigen Formatspezifikationen (%d,%x,%o) einlesen.

    (oder noch besser - du verwendest iostream's dafür)



  • Hallo

    - du verwendets C-Funktionen. Solltest aber besser die entsprechenden C++ Möglichkeiten verwenden (cout/cin, stringstream...)

    - du willst eine Zahl in einen einzelnen char einlesen... also nur ein einzelne Ziffer.

    /edit : zu langsam

    bis bald
    akari



  • Hallo, Danke für die Antworten, hab gerade gesehn das ich wohl im falschen forum bin, denn wir sollen es nur in C programmieren.

    @CStoll : das \n kann ich doch wegbekommen in dem ich es so schreibe oder?:

    scanf("%c", auswahl);
    getchar();
    

    was genau sind iostreams?

    Danke für eure Antworten.

    EDIT:

    Habs nun folgendermaßen geändert:

    #include <stdio.h>
    
    int main(void)
    {
    	char auswahl;
    	int zahl;
    
    	printf("Wollen Sie eine (O)ktal-, eine He(x)adezimal- oder eine(D)ezimal-Zahl eingeben: ");
    	scanf("%c", &auswahl);
    
    	switch(auswahl)
    	{
    	case 'X':
    	case 'x': //'x'||'X':
    		printf("Hexadezimalzahl eingeben: ");
    		scanf("%x",&zahl);
    		printf("Die Eingabe war: %d ", zahl);
    		break;
    	case 'O': //'o'||'O':
    	case 'o':
    		printf("Oktalzahl eingeben: ");
    		scanf("%o", &zahl);
    		printf("Die Eingabe war: %d ", zahl);
    		break;
    	case 'D': //'d'||'D':
    	case 'd':
    		printf("Dezimalzahl eingeben: ");
    		scanf("%d",&zahl);
    		printf("Die Eingabe war: %d ", zahl);
    		break;
    	}
    	return 0;
    }
    

    Es funktioniert 🙂

    Danke für eure Tips



  • mazeli schrieb:

    Hallo, Danke für die Antworten, hab gerade gesehn das ich wohl im falschen forum bin, denn wir sollen es nur in C programmieren.

    @CStoll : das \n kann ich doch wegbekommen in dem ich es so schreibe oder?:

    scanf("%c", auswahl);
    getchar();
    

    Wenn du Glück hast, ja, besser ist anstelle eines einzelnen getchar() allerdings eine Schleife "while(getchar()!='\n');".
    (aber wenn du bei den nächsten Eingabebefehlen nach int-Werten fragst, werden Whitespaces sowieso überlesen.

    was genau sind iostreams?

    Für einen C-Programmierer uninteressant 😉
    (oder anders: Streams sind das C++ Äquivalent zu FILE*)


Anmelden zum Antworten