Switch/case mit char. In C

#1
Hallo Leute!

Ich habe ein Problem und ich komme einfach nicht drauf.

Bei meinem Programm möchte ich eine switch/case verzweigung mit einem Char machen. Leider springt mein Programm immer zu meinem 'default', obwohl ich die Eingabe richtig tätige, also muss der Fehler wohl im Programm liegen. Selbst schon in Lehrbüchern gestöbert, da wurde exakt das selbe gemacht...

Anhang anzeigen 4378


Über jeden Tipp dankbar!
 
#3
Soweit ich sehe, soll "toupper" einfach die Buchstaben zu Kapitalbuchstaben machen - also Großbuchstaben.

Warum nicht so?

Code:
switch(auswahl){
    case 'U': case 'u': ...
}
Dazu muss "auswahl" auch vom Typ char sein. Wie stellst du sicher, dass getch() korrekt verwendet wird? Soweit ich weiß, ist die Deklaration
"int getch(void)", d.h. die korrekte Verwendung wäre "auswahl = getch()". Warum hat C keine Probleme ein Char mit einem Integer zu belegen? ;)

@Chakky, soweit ich es sehen kann, liegen hier viele fundamentale Fehler vor, die evtl. bereits durch die korrekte Verwendung von getch/getchar bereinigt werden könnten. Vermutlich wurde hier "gets()" mit "getch()" verwechselt.
 
Zuletzt bearbeitet:

Pik-9

New member
#5
Hallo,

das Problem ist, dass in C der default-Block immer ausgeführt wird, sobald die Ausführung an diese Stelle gelangt. Der einzige Weg, das zu verhindern ist, mit einem break aus dem switch-Block herauszuspringen:
Code:
#include <stdio.h>

int main (int argc, char *argv[])
{
  /* Versuche mal, hier mit anderen Zeichen herumzuspielen. */
  char c = 'a';

  switch (c)  {
    case 'a':  {
      puts ("War ein a.");
      break;
    }

    case 'b':  {
      puts ("War ein b.");
      break;
    }

    default:  {
      puts ("War weder a noch b.");
      /* Der letzte Block braucht kein break, da wir danach den switch-Block ja sowieso verlassen. */
    }
  }

  return 0;
}
Viele Grüße,
Pik-9
 
Zuletzt bearbeitet:
#6
Hallo,

das Problem ist, dass in C der default-Block immer ausgeführt wird, sobald die Ausführung an diese Stelle gelangt. Der einzige Weg, das zu verhindern ist, mit einem break aus dem switch-Block herauszuspringen:
Code:
#include <stdio.h>

int main (int argc, char *argv[])
{
  /* Versuche mal, hier mit anderen Zeichen herumzuspielen. */
  char c = 'a';

  switch (c)  {
    case 'a':  {
      puts ("War ein a.");
      break;
    }

    case 'b':  {
      puts ("War ein b.");
      break;
    }

    default:  {
      puts ("War weder a noch b.");
      /* Der letzte Block braucht kein break, da wir danach den switch-Block ja sowieso verlassen. */
    }
  }

  return 0;
}
Viele Grüße,
Pik-9
Das "break;" setzt er in seinem Code, steht am Ende der Zeile.

@Chrom, genau - aber die Frage war mehr an den TE gerichtet :)
 

Chromatin

Moderator
Mitarbeiter
#7
Code:
#include <stdio.h>
void main (int argc, char *argv[])
{  
  char auswahl;    
  auswahl = getchar();    
  
  switch (toupper(auswahl))  {    
    case 'A':  {      
       puts ("War ein A");      
       break;    
    }    

    default:  {      
       puts ("War weder a noch b.");    
    }  
  }  
}
So funktionierts gedenfalls.
Zeig doch mal deinen ganzen code und check gg. Compilerwarnungen.
Mach ein paar printf um deine Eingabe zu checken.
 
#8
Weil in C ein char ein 2-Byte integer ist ;)
[...]
Auf welcher Architektur? Quelle bitte!

Der untere Code liefert auf Linux und Windows (amd64) jeweils eine Größe von 1 Byte mit einer Länge von 8 Bit beim Datentyp char.
Auch ist bei den AVR Microcontrollern der Datentyp char 1Byte groß. ARM64 habe ich jetzt noch nicht ausprobiert. Habe ich aber
auch hier daheim liegen.

Übrigens ist GCC dumm. Der C Compiler von Visual Studio spuckt bei char c = getchar();
eine Warnmeldung aus:

Code:
#include <stdio.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    char c = getchar();
    
    printf("sizeof char: %d\n", sizeof(char));
    printf("bits: %d\n", CHAR_BIT);
    return 0;
}
Code:
warning C4242: "Initialisierung": Konvertierung von "int" in "char", möglicher Datenverlust
Edit:
Okay, nehme ich zurück, dass GCC dumm ist. Allerdings wenn man schon -Wall angibt sollte logischerweise der Schalter -Wconversion auch aktiviert sein.
Aber der Grund warum nicht, steht in den man pages.
 
Zuletzt bearbeitet:

Chromatin

Moderator
Mitarbeiter
#9
Auf welcher Architektur? Quelle bitte!

Der untere Code liefert auf Linux und Windows (amd64) jeweils eine Größe von 1 Byte mit einer Länge von 8 Bit beim Datentyp char.
Auch ist bei den AVR Microcontrollern der Datentyp char 1Byte groß. ARM64 habe ich jetzt noch nicht ausprobiert. Habe ich aber
auch hier daheim liegen.
Da gabs ein Typo welchen ich klargestellt hatte ;)

Weil in C ein char ein 2-Byte integer ist ;)

Erm..1 Byte/8-bit als Minimum.
 
Oben