Переключить оператор с помощью или - PullRequest
24 голосов
/ 16 января 2011

Я создаю консольное приложение и использую оператор switch для создания простой системы меню.Ввод пользователя осуществляется в виде одного символа, который отображается на экране в виде заглавной буквы.Однако я хочу, чтобы программа принимала как символы нижнего, так и верхнего регистра.

Я понимаю, что операторы switch используются для сравнения с константами, но возможно ли сделать что-то вроде следующего?

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

Если это невозможно, есть ли обходной путь?Я действительно не хочу повторять код.

Ответы [ 6 ]

45 голосов
/ 16 января 2011

Таким образом:

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

Подробнее по этой теме: http://en.wikipedia.org/wiki/Switch_statement#C.2C_C.2B.2B.2C_Java.2C_PHP.2C_ActionScript.2C_JavaScript

20 голосов
/ 16 января 2011

Общепринятый синтаксис для этого:

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

Т.е.: из-за отсутствия break выполнение программы переходит в следующий блок. Это часто называют "провалиться".

Тем не менее, вы можете, конечно, просто нормализовать регистр переменной menuChoice в этом случае с помощью toupper / tolower.

3 голосов
/ 16 января 2011

'q' || 'Q' приводит к bool типу результата ( true ), который повышается до целочисленного типа, используемого в состоянии переключателя ( char ) - давая значение 1 Если бы компилятор разрешил использовать одно и то же значение (1) в нескольких метках, во время выполнения switch оператор menuChoice будет сравниваться со значением 1 в каждом случае. Если бы menuChoice имел значение 1, код под первой меткой регистра был бы выполнен.

Поэтому предлагаемые ответы здесь используют символьную константу (которая имеет тип char ) в качестве целочисленного значения в каждой метке.

3 голосов
/ 16 января 2011

Вы можете (и из-за соображений возможности восстановления) перед вводом оператора switch использовать tolower fnc на своей переменной.

3 голосов
/ 16 января 2011

Просто используйте tolower(), вот мой мужчина:

СИНТАКСИС
#include ctype.h

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

ОПИСАНИЕ toupper () преобразует букву c в верхний регистр, если это возможно.

   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.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ Возвращаемое значение соответствует значению преобразованной буквы или c, если преобразование было невозможно.

Итак, в вашем примере вы можете switch() с помощью:

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

Конечно, вы можете использовать как toupper(), так и tolower(), с прописными и заглавными буквами.

2 голосов
/ 16 января 2011
switch (toupper(choice))
{
  case 'Q':...
}

... или tolower.

...