【问题标题】:C89 Switch case using a setC89 开关盒使用一套
【发布时间】:2020-03-06 15:52:19
【问题描述】:

我正在尝试编写一个函数来检查输入是否是有效的双精度值。因为我最近了解了 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 是否有效?我正在尝试使用一组数字。所以如果 char carrier[i] 是数字大小写匹配。我知道 isdigit() 函数,但我不想解决这个问题,除非 switch case 无法与集合一起使用。

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

【问题讨论】:

  • "+" || "-"'[0-9]' 均无效。您需要分别检查每个值。这就是switch/case 的工作原理。
  • 您可以将case '+': case '-': 与单引号和重复大小写一起使用。如果您想从 0 到 9 捕获,则必须以手写方式将其写出来 (case '0': case '1': …: case '9':)。在任何版本的 C 中都没有可用的简写。
  • @JonathanLeffler GCC 允许大小写范围:gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html
  • @qrdl OP 有“代码需要符合 c89 标准”并且 gcc 扩展不在 C89 或任何标准 C 中。

标签: c gcc set switch-statement c89


【解决方案1】:

问题只是关于陈述案件的正确方式。
代码需要符合 c89 标准

在标准 C 中每个案例只有 1 个常量。在 C89 中不使用 // cmets。

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;
}

【讨论】:

    【解决方案2】:

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

    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
    }
    

    【讨论】:

      【解决方案3】:
      1. 不,至少在您的意思上:"+" || "-" 的值是 1,因为逻辑或运算符 || 的操作数("+""-")中至少有一个非零。

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

      请注意,除非您中断,否则案例会一直延续到下一个,因此这样的代码可以工作:

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

      (请注意,'+''-' 需要使用单引号来使它们成为字符。"+""-" 是字符串,它们不等于字符,并且不能无论如何,与switch 正确匹配,请参阅strcmp。)

      【讨论】:

        【解决方案4】:

        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

        【讨论】:

        • ... 并且由于 switch case 范围 扩展,因此使用它们与 OP 使用符合 C89 标准的代码的要求不一致。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 2017-02-08
        相关资源
        最近更新 更多