web-dev-qa-db-fra.com

Instruction Switch à l'aide de ou

Je crée une application console et j'utilise une instruction switch pour créer un système de menus simple. L'entrée utilisateur se présente sous la forme d'un caractère unique qui s'affiche à l'écran sous forme de majuscule. Cependant, je veux que le programme accepte à la fois les minuscules et les majuscules.

Je comprends que les instructions switch sont utilisées pour comparer les constantes, mais est-il possible de faire quelque chose comme ce qui suit?

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

Si ce n'est pas possible, existe-t-il une solution? Je ne veux vraiment pas répéter le code.

29
Saladin Akara

Par ici:

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

En savoir plus sur ce sujet: http://en.wikipedia.org/wiki/Switch_statement#C.2C_C.2B.2B.2C_Java.2C_PHP.2C_ActionScript.2C_JavaScript

46
Chris Hasiński

La syntaxe généralement acceptée pour cela est:

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

c'est-à-dire: en raison de l'absence d'un break, l'exécution du programme se répercute en cascade dans le bloc suivant. Ceci est souvent appelé "chute".

Cela dit, vous pouvez bien sûr simplement normaliser le cas de la variable 'menuChoice' dans ce cas via toupper/tolower.

20
John Parker

Vous pouvez (et pour des raisons de réductibilité, devriez) avant de saisir l'instruction switch, utilisez tolower fnc sur votre var.

'q' || 'Q' résulte en bool type result (true) qui est promu en type intégral utilisé dans la condition de commutation (char) - donnant la valeur 1. Si le compilateur permettait d'utiliser la même valeur (1) dans plusieurs étiquettes, lors de l'exécution de l'instruction switchmenuChoice serait comparée à la valeur 1 dans chaque cas. Si menuChoice avait la valeur 1, le code sous la première étiquette de cas aurait été exécuté.

Par conséquent, les réponses suggérées ici utilisent la constante de caractère (qui est de type char) comme valeur intégrale dans chaque étiquette de cas.

3
Bojan Komazec

Utilisez simplement tolower(), voici mon homme:

SYNOPSIS
# inclure ctype.h

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

DESCRIPTION toupper () convertit la lettre c en majuscule, si possible.

   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.

VALEUR RENVOYÉE La valeur renvoyée est celle de la lettre convertie, ou c si la conversion n'a pas été possible.

Ainsi, dans votre exemple, vous pouvez switch() avec:

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

Bien sûr, vous pouvez utiliser à la fois toupper() et tolower(), avec des majuscules et des majuscules.

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

... ou tolower.

2
Edward Strange

si tu fais

case('s' || 'S'):
    // some code
default:
    // some code

s et S seront ignorés et le code par défaut s'exécutera chaque fois que vous saisirez ces caractères. Vous pouvez donc décider d'utiliser

case 's':
case 'S':
    // some code

ou

switch(toupper(choice){
    case 'S':
        // some code.

toupper vous aurez besoin d'inclure ctype.h.

0
eyong kevin