2011-01-16 10 views
17

Ich erstelle eine Konsolenanwendung und verwende eine switch-Anweisung, um ein einfaches Menüsystem zu erstellen. Die Benutzereingabe erfolgt in Form eines einzelnen Zeichens, das als Kapital auf dem Bildschirm angezeigt wird. Ich möchte jedoch, dass das Programm sowohl Groß- als auch Kleinbuchstaben akzeptiert.Switch-Anweisung - mit oder?

Ich verstehe, dass Schalter gegen Konstanten vergleichen verwendet werden, aber ist es möglich, so etwas zu tun:

switch(menuChoice) { 
    case ('q' || 'Q'): 
     //Some code 
     break; 
    case ('s' || 'S'): 
     //More code 
     break; 
    default: 
     break; 
} 

Wenn dies nicht möglich ist, gibt es eine Arbeit um, da ich nicht wirklich tun Code wiederholen wollen - so kurz wie diese Wiederholungen sein werden.

Antwort

17

Die allgemein akzeptierte Syntax hierfür lautet:

switch(menuChoice) { 
    case 'q': 
    case 'Q': 
     //Some code 
     break; 
    case 's': 
    case 'S': 
     //More code 
     break; 
    default: 
     break; 
} 

dh: Aufgrund des Fehlens eines break, Programm Ausführung kaskadiert in den nächsten Block. Dies wird oft als "Durchfall" bezeichnet.

Das heißt, Sie könnten natürlich einfach den Fall der Variable 'menuChoice' in diesem Fall über toupper/tolower normalisieren.

+1

Ich denke, das sollte die beste Antwort sein, nicht die eine oben - Nicht nur Antwort auf wie es zu lösen, aber es sagt Ihnen auch, warum, bevor Sie einen Link gehen müssen, die möglicherweise oder nicht existieren. –

2
switch (toupper(choice)) 
{ 
    case 'Q':... 
} 

... oder tolower.

+0

sollten Sie (aus Portabilitätsgründen) tolower verwenden, laut B.S. –

3

Nur tolower() verwenden, hier ist mein Mann:

SYNTAX
#include ctype.h

int toupper(int c); 
    int tolower(int c); 

BESCHREIBUNG toupper() konvertiert den Buchstaben c in Großbuchstaben, wenn möglich.

tolower() converts the letter c to lower case, if possible. 

    If c is not an unsigned char value, or EOF, the behavior of these 
    functions is undefined. 

UCKGABEWERT Der Rückgabewert ist, dass die konvertierten Buchstaben oder c, wenn die Umwandlung nicht möglich ist.

So in Ihrem Beispiel können Sie switch() mit:

switch(tolower(menuChoice)) { 
    case('q'): 
     // ... 
     break; 
    case('s'): 
     // ... 
     break; 
} 

Natürlich können Sie beide toupper() und tolower(), mit Kapital und nicht-Großbuchstaben verwenden.

3

Sie könnten (und aus Gründen der Redierbarkeit, sollte) vor dem Eingeben von Switch-Anweisung tolower fnc auf Ihrem var.

3

'q' || 'Q' Ergebnisse in bool Typ Ergebnis (wahre), die im Schaltzustand verwendet, um integralen Typ gefördert wird (char) - der Wert 1 ergibt.Wenn der Compiler den gleichen Wert (1) für die Verwendung in mehreren Labels zulässt, wird während der Ausführung von der Switch die Anweisung menuChoice mit dem Wert von 1 in jedem Fall verglichen. Wenn menuChoice den Wert 1 hätte, wäre der Code unter dem ersten Case-Label ausgeführt worden.

Daher verwenden die hier vorgeschlagenen Antworten die Zeichenkonstante (die vom Typ char ist) als Integralwert in jedem Fall Label.