2011-01-16 8 views
17

Estoy creando una aplicación de consola y el uso de una sentencia switch para crear un sencillo sistema de menús. La entrada del usuario tiene la forma de un solo carácter que se muestra en pantalla como un capital. Sin embargo, quiero que el programa acepte caracteres tanto en mayúsculas como en minúsculas.Conmutar declaración - ¿usar o?

entiendo que los interruptores se utilizan para comparar contra constantes, pero es posible hacer algo como esto:

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

Si esto no es posible, hay un trabajo en torno a que realmente no lo hacen quiere repetir el código, tan corto como esas repeticiones serán.

Respuesta

17

La sintaxis generalmente aceptada para este 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, el programa de las cascadas de ejecución en el siguiente bloque. Esto a menudo se conoce como "caída".

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

+1

Creo que esta debería ser la mejor respuesta, no la de arriba - No solo responde sobre cómo resolverlo, sino que también le dice por qué antes de tener que ir a un enlace que puede existir o no. –

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

... o tolower.

+0

debe (por razones de portabilidad) usar tolower, de acuerdo con B.S. –

3

sólo tiene que utilizar 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úsculas, 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. 

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

Así que en su ejemplo, usted puede switch() con:

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

Por supuesto se puede utilizar tanto toupper() y tolower(), con mayúsculas y no de capital.

3

Usted podría (y por razones de redability, debería) antes de entrar en el uso instrucción switch tolower FNC en su var.

3

'q' || 'Q' resultados en bool resultado tipo (cierto), que es promovido a tipo integral utilizado en condición de conmutación (Char) - que da el valor 1.Si el compilador permitió que se usara el mismo valor (1) en varias etiquetas, durante la ejecución del , la instrucción del interruptor menuChoice se compararía con el valor de 1 en cada caso. Si menuChoice tenía el valor 1, entonces el código bajo la primera etiqueta del caso se habría ejecutado.

Por lo tanto, las respuestas sugeridas aquí usan la constante de caracteres (que es del tipo char) como valor integral en cada etiqueta de caso.

Cuestiones relacionadas