Danke Danke:  0
Gefällt mir Gefällt mir:  0
Dislikes Dislikes:  0
Ergebnis 1 bis 10 von 10

Thema: Switch/case mit char. In C

  1. #1

    Registriert seit
    29.06.18
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    0

    Standard Switch/case mit char. In C

    Anzeige
    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...

    switch case1.PNG


    Über jeden Tipp dankbar!

  2. #2
    Member of Honour Avatar von Chakky
    Registriert seit
    28.10.03
    Danke (erhalten)
    17
    Gefällt mir (erhalten)
    227

    Standard

    Wie wärs mit den ganzen Code?
    cu
    Chakky

    we are dreaming in digital
    we are living in realtime
    we are thinking in binary
    we are talking in IP
    welcome to our world

  3. #3

    Registriert seit
    05.12.15
    Danke (erhalten)
    8
    Gefällt mir (erhalten)
    21

    Standard

    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.
    Geändert von Shalec (03.07.18 um 08:51 Uhr)

  4. #4
    Moderator
    Registriert seit
    30.06.08
    Danke (erhalten)
    32
    Gefällt mir (erhalten)
    843

    Standard

    Warum hat C keine Probleme ein Char mit einem Integer zu belegen?
    Weil in C ein char ein 2-Byte integer ist

    Erm..1 Byte/8-bit als Minimum.
    Wenn ein Gesetz nicht gerecht ist, dann geht die Gerechtigkeit vor dem Gesetz!

    Habo Blog - http://blog.hackerboard.de/

  5. #5
    Avatar von Pik-9
    Registriert seit
    07.08.17
    Danke (erhalten)
    1
    Gefällt mir (erhalten)
    11

    Standard

    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
    Geändert von Pik-9 (04.07.18 um 00:57 Uhr) Grund: Code war unvollständig.

  6. #6

    Registriert seit
    05.12.15
    Danke (erhalten)
    8
    Gefällt mir (erhalten)
    21

    Standard

    Zitat Zitat von Pik-9 Beitrag anzeigen
    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

  7. #7
    Moderator
    Registriert seit
    30.06.08
    Danke (erhalten)
    32
    Gefällt mir (erhalten)
    843

    Standard

    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.
    Wenn ein Gesetz nicht gerecht ist, dann geht die Gerechtigkeit vor dem Gesetz!

    Habo Blog - http://blog.hackerboard.de/

  8. #8

    Registriert seit
    03.07.15
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    2

    Standard

    Zitat Zitat von Chromatin Beitrag anzeigen
    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.
    Geändert von fork(Agent Smith) (10.07.18 um 06:39 Uhr)
    /* Beware of bugs in the above code;
    I have only proved it correct, not tried it. */


    Original quote by Donald E. Knuth

  9. #9
    Moderator
    Registriert seit
    30.06.08
    Danke (erhalten)
    32
    Gefällt mir (erhalten)
    843

    Standard

    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.
    Wenn ein Gesetz nicht gerecht ist, dann geht die Gerechtigkeit vor dem Gesetz!

    Habo Blog - http://blog.hackerboard.de/

  10. #10

    Registriert seit
    03.07.15
    Danke (erhalten)
    0
    Gefällt mir (erhalten)
    2

    Standard

    Anzeige
    Zitat Zitat von Chromatin Beitrag anzeigen
    Da gabs ein Typo welchen ich klargestellt hatte
    Okay, alles klar.
    /* Beware of bugs in the above code;
    I have only proved it correct, not tried it. */


    Original quote by Donald E. Knuth

Ähnliche Themen

  1. [C++] Vector nach char?
    Von Extinction im Forum Code Kitchen
    Antworten: 3
    Letzter Beitrag: 06.11.07, 16:59
  2. What if the SCO case was on IRC?
    Von Gnome im Forum Fun Section
    Antworten: 0
    Letzter Beitrag: 17.06.07, 14:20
  3. [C++] Switch mit char problem
    Von gbNiNjA im Forum Code Kitchen
    Antworten: 2
    Letzter Beitrag: 20.12.06, 16:50
  4. V8 case
    Von -= pillepalle =- im Forum Hardware Mods
    Antworten: 1
    Letzter Beitrag: 28.04.05, 19:03
  5. mit char in switch/case Anweisung bei C
    Von M.D.Geist im Forum Code Kitchen
    Antworten: 17
    Letzter Beitrag: 06.08.04, 11:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •