C89开关盒使用一套

C89 Switch case using a set

我正在尝试编写一个函数来检查输入是否为有效的双精度值。因为最近了解了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;


    }

回答问题请忽略代码资源。问题只是关于陈述案例的正确方法。

1) 案例 1 是否有效,或者我必须将其分成两个不同的案例

2) case 3 有效吗?我正在尝试使用一组数字。所以如果 char carrier[i] 是一个数字大小写匹配。我知道 isdigit() 函数,但我不想绕过这个问题,除非 switch case 不可能与集合一起工作。

额外信息: - carrier ist 类型为 char* 并且已被赋予一个值 - 我正在用 gcc 编译,代码需要符合 c89 标准,不管是什么。

  1. 不,至少在你的意思是:"+" || "-"的值是1,因为至少有一个操作数("+""-" ) 的逻辑或运算符 || 是非零的。

  2. 不是,C switch中没有字符串或正则表达式匹配,单引号(')的大小写是多字节字符。

请注意,除非您中断,否则案例会进入下一个案例,因此这样的代码有效:

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

(请注意,您需要为 '+''-' 使用单引号以使其成为字符。您拥有的 "+""-" 是字符串,不要比较等于字符,并且无论如何都不能与 switch 正确匹配,请参阅 strcmp。)

对于你的问题,语法如下:

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
}

Switch case 范围是 gcc 扩展

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

The Question is only about the proper way to state a case.
the code needs to be in c89 standard

在标准 C 中每个案例只有 1 个常量。在 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;
}