Проверка номеров в операторе переключения - PullRequest
2 голосов
/ 14 февраля 2010

Есть ли простой способ проверить цифры 0-9 с помощью оператора switch? Я пишу программу для проверки определенных символов, а также цифр. Как проверка на '\ 0', 'F' или 'f', и мне было интересно, есть ли способ проверить 0-9 подобным образом. Я знаю, что могу написать программу, которая возвращает true или false, если символ представляет собой цифру 0-9, но я не был уверен, как использовать это с одним из случаев в операторе switch. Как если бы я имел:

const int lowerBound = 48;
const int upperBound = 57;

bool isDigit(char *digit)
{
    if (*digit >= lowerBound && *digit <= upperBound) {
        return true;
    }
    else {
        return false;
    }
}

как я могу идти

switch (*singleChar) {
    case(???):
}

Ответы [ 8 ]

3 голосов
/ 14 февраля 2010
switch(mychar) {

   case '0':
   case '1':
   case '2':
   ..
   // your code to handle them here
   break; 

   .. other cases
}

Это называется "сквозной" - если блок дела не завершается разрывом, поток управления продолжается при следующей инструкции дела.

2 голосов
/ 14 февраля 2010

Держись! Почему вы определяете свою собственную функцию isDigit, если она уже доступна в функции в заголовочном файле ctype.h ... Рассмотрим следующее:

char *s = "01234"; char *p = s;
while(*p){
    switch(*p){
        case 'A' :
            break;
        default:
            if (isdigit(*p)){
                puts("Digit");
                p++;
            }
            break;
    }
}

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 14 февраля 2010

Я бы, вероятно, написал оператор switch для конкретных букв (´f´, ´F´ ...) и добавил бы условие в блок else.

switch ( ch ) {
case 'f': // ...
   break;
case 'F': // ...
   break;
default:
   if ( isDigit(ch) ) {
   }
};

(Также обратите внимание, что в заголовке <cctype> имеется стандартная функция isdigit из стандартного C, а в <locale> - другая, которая принимает локаль в качестве параметра и выполняет проверки на основе этой локали)

1 голос
/ 14 февраля 2010

Я думаю, что GCC поддерживает нестандартное расширение, где вы можете делать такие вещи:

switch(myChar)
{
case '0'...'2':
    // Your code to handle them here
    break;

.. other cases
}

Но это НЕСТАНДАРТ и, например, не компилируется в Visual Studio.

1 голос
/ 14 февраля 2010

Это, вероятно, сделает это, но, честно говоря, это довольно уродливо.Вероятно, я бы использовал другую конструкцию (может быть, регулярное выражение?), Если бы не знал, что это главная точка доступа, и даже тогда я бы профилировал.

switch (*singlChar) {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        // do stuff
        break;
    default:
        // do other stuff
}
0 голосов
/ 17 ноября 2015

Как насчет:

int isdigit(char input) {
    return (input < '0' || input > '9') ? 0 : 1; 
}

...

if(isdigit(currentChar)) {
    ...
}
else {
    switch(currentChar) {
        case 'a' {
            ...
            break;
        }
        ...
    }
}
0 голосов
/ 02 ноября 2015

Пожалуйста, используйте ниже код.

переключатель (* singleChar) {

         case 48 ... 57: return true;

         default: return false; 

}

0 голосов
/ 14 февраля 2010

Вы могли бы сделать это

char input = 'a';

switch (input)
{
  case 'a': // do something; break;
  // so on and so forth...
  default: break
}
...