C89 Выключатель с использованием набора - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь написать функцию, которая проверяет, является ли ввод действительным двойным значением. так как я недавно узнал о функции switch / case / default, я хотел использовать ее для решения проблемы

switch(carrier[i]){
        case ("+" || "-") :  //case 1
            if(kvcase == closed){
                printf("Error! Invaled input\n");
            }
            else /*save sign and close case*/
                break;

        case '.' : 
            if(deccase == closed){
                printf("Error! Invaled input\n");
            }
            else /*save comma and close case*/
                break;

        case '[0-9]' :  //case 3
            break;

        case ' ':
            printf("staring with whitespace\n");
            break;

        default:
        printf("empty\n");
            break;


    }

Чтобы ответить на вопрос, пожалуйста, играйте в resr кода. Вопрос только в том, как правильно изложить дело.

1) допустимо ли дело 1, или я должен разделить его на два разных случая

2) действительно ли дело 3? Я пытаюсь использовать набор чисел. так что если символ носителя [i] является числом, то регистр совпадает. Мне известна функция isdi git (), но я не хочу просто обойти проблему, если только невозможно переключить корпус для работы с множеством.

Дополнительная информация: - тип носителя типа char * и ему присвоено значение - я компилирую с помощью g cc, и код должен соответствовать стандарту c89, что бы это ни было.

Ответы [ 4 ]

1 голос
/ 07 марта 2020

Вопрос только о том, как правильно изложить дело.
код должен соответствовать стандарту c89

Только 1 константа на случай в стандарте C. Не использовать // комментариев в C89.

switch(carrier[i]) {
  case `+`: /* Fall through */  /*Comment not required, but good style */
  case `=`: 
    /* case 1 code here */
    break;
  case '.' : 
    if(deccase == closed) ...
    break;
  case '0' : /* Fall through */
  case '1' : /* Fall through */
  case '2' : /* Fall through */
  case '3' : /* Fall through */
  case '4' : /* Fall through */
  case '5' : /* Fall through */
  case '6' : /* Fall through */
  case '7' : /* Fall through */
  case '8' : /* Fall through */
  case '9' : 
    /* case 3 */
    ...
    break;
  case ' ':
    printf("staring with whitespace\n");
    break;
  default:
    printf("empty\n");
    break;
}
1 голос
/ 06 марта 2020

По вашему вопросу синтаксис следующий:

switch (expr) {
  case '1':
    printf("expr=1");
  case '2':
    printf("expr=2");
    break;
  case '3':
    printf("expr=3");
    break;
}

Итак:

  • Случай 1 недействителен: используйте case '1': case '2':. Ваш случай может скомпилироваться, но не дать ожидаемый результат ("+"||"-" может разрешить до 1).
  • Случай 3 недействителен: вы должны записать все дела (от '0' до '9').

Если вы хотите минимизировать это, используйте if:

if (c == '+' || c == '-') {
  // ...
} else if (c == '.') {
  // ...
} else if ('0' <= c && c <= '9') { // or isdigit(c)
  // ...
} else {
  // invalid character
}
1 голос
/ 06 марта 2020

Диапазон значений переключателя: г cc расширение

void foo(int ch)
{
    switch(ch)
    {
        case 'A' ... 'Z':
        case 'a' ... 'z':
            printf("'%c' is a letter\n", ch);
            break;
        case '0' ... '9':
            printf("'%c' is a digit\n", ch);
            break;
        case '+':
        case '*':
        case '-':
        case '%':
        case '/':
        case '^':
            printf("'%c' is a math operator\n", ch);
            break;
        default:
            printf("'%c' is something else\n", ch);
            break;
    }
}
int main()
{
    for(int x = 0; x < 50; x++)
    {
        foo(32+ rand() % 90);
    }
}

https://godbolt.org/z/UT-wkC

1 голос
/ 06 марта 2020
  1. Нет, по крайней мере, в том смысле, который вы имеете в виду: значение "+" || "-" равно 1, поскольку хотя бы один из операндов ("+" и "-") логического оператора или || не равен нулю.

  2. Нет, в C switch нет совпадений строк или регулярных выражений, а в случае одинарных кавычек (') является многобайтовым символом.

Обратите внимание, что случаи переходят к следующему, если вы не разбиваете, поэтому код работает следующим образом:

case '+':
case '-':
    (void) printf("+ or -\n");
    break;

(Обратите внимание, что вы необходимо использовать одинарные кавычки для '+' и '-', чтобы сделать их символами. Ваши "+" и "-" являются строками, которые не сравниваются равными символам и не могут быть должным образом сопоставлены с switch в любом случае, см. strcmp.)

...