Instrucción Switch usando or


Estoy creando una aplicación de consola y usando una instrucción switch para crear un sistema de menú simple. La entrada del usuario es en forma de un solo carácter que se muestra en la pantalla como una letra mayúscula. Sin embargo, quiero que el programa acepte caracteres en mayúsculas y minúsculas.

Entiendo que las declaraciones switch se usan para comparar con constantes, pero ¿es posible hacer algo como lo siguiente?

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

Si esto no es posible, ¿hay una solución alternativa? Realmente no quiero repite el código.

Author: Rodrigo de Azevedo, 2011-01-16

6 answers

De esta manera:

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

Más sobre este tema: http://en.wikipedia.org/wiki/Switch_statement#C.2C_C.2B.2B.2C_Java.2C_PHP.2C_ActionScript.2C_JavaScript

 40
Author: Chris Hasiński,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-21 09:00:32

La sintaxis generalmente aceptada para esto es:

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

Es decir: Debido a la falta de un break, la ejecución del programa cae en cascada en el siguiente bloque. Esto a menudo se conoce como"caída a través".

Dicho esto, por supuesto, simplemente podría normalizar el caso de la variable 'menuChoice' en este caso a través de toupper/tolower.

 18
Author: John Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-15 09:51:45

Solo usa tolower(), aquí está mi hombre:

SINOPSIS
# include ctype.h

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

DESCRIPCIÓN toupper () convierte la letra c a mayúscula, si es posible.

   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.

VALOR DE RETORNO El valor devuelto es el de la letra convertida, o c si el la conversión no fue posible.

Así que en tu ejemplo puedes switch() con:

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

Por supuesto, puedes usar toupper() y tolower(), con mayúsculas y no mayúsculas.

 3
Author: BlackBear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-16 11:24:51

Podría (y por razones de redabilidad, debería) antes de ingresar la instrucción switch usar tolower fnc en su var.

 3
Author: There is nothing we can do,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-16 11:26:21

'q' || 'Q' resultados en bool resultado de tipo ( true ) que se promueve al tipo integral utilizado en la condición de interruptor ( char ) - dando el valor 1. Si el compilador permite que se use el mismo valor (1) en varias etiquetas, durante la ejecución de la instrucción switch menuChoice se compararía con el valor de 1 en cada caso. Si menuChoice tuviera el valor 1 entonces se habría ejecutado el código bajo la primera etiqueta de caso.

Por lo tanto, las respuestas sugeridas aquí usan la constante de carácter (que es de type char) como valor integral en cada etiqueta de caso.

 3
Author: Bojan Komazec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-16 12:08:21
switch (toupper(choice))
{
  case 'Q':...
}

...o tolower.

 2
Author: Crazy Eddie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-16 11:23:51