切换案例使用c语言的数组

时间:2018-04-01 06:26:06

标签: c if-statement assembly switch-statement

如何在C中使用带有阵列的开关盒?我知道我可以使用if语句来满足我的需求:

char *choice[]={'option1', 'option2'}
    if (strcmp choice[0], input)==0){
        // do the job
    }
    else{
        // something
    }

所以我写这篇文章的原因是因为我看到人们在这里给出了一些好的指南,但这并不是这个人所要求的,所以只是想澄清一下,我知道这些概念只是我得到提示或相关的例子来看我如何在C语言中使用带有数组的switch case。有些地方说开关不能使用数组字符串,所以想澄清是否真的。

3 个答案:

答案 0 :(得分:0)

不,你不能在switch语句中使用字符串(也不是任何类型的数组)。根据C11标准,

  

switch语句的控制表达式应为整数类型。

这是switch语句实现方式的结果。虽然不是由标准强加的,但实现switch语句的一种常用方法是使用指针数组来编码,并在每个可能的大小写值处放置需要执行的指令。这也是为什么如果落空的原因:一旦找到案例,它就会从我之前提到的数组所指示的位置开始执行指令,并且没有机制可以停止。

由于您无法使用数组索引数组,因此禁止在switch语句中使用它们。

答案 1 :(得分:0)

  

如何在C

中使用带有数组的开关盒

C不是具有许多功能的语言,交换机内的表达式与C中的每个其他表达式一样被评估。switch需要一个返回整数的表达式。在string的情况下,在C中我们使用strcmp()但是这个函数返回一个很大的值范围,可以在switch语句中使用。这就是为什么strcmp()不是一个很好的功能来显示切换的好用,这里有一个更好的例子:

#include  <stdio.h>

enum foo {
    EQUAL,
    LESS,
    GREATER,
};

enum foo cmp_int(int a, int b) {
    if (a < b) {
        return LESS;
    }
    else if (a > b) {
        return GREATER;
    }
    else {
        return EQUAL;
    }
}

void magic(int a, int b) {
    switch (cmp_int(a, b)) {
      case LESS:
        printf("%d is less than %d\n", a, b);
        break;
      case GREATER:
        printf("%d is greater than %d\n", a, b);
        break;
      case EQUAL:
        printf("%d is equal to %d\n", a, b);
        break;
    }
}

int main(void)
{
    magic(1, 2);
    magic(5, -5);
    magic(0, 0);
}

输出:

1 is less than 2
5 is greater than -5
0 is equal to 0

答案 2 :(得分:0)

您只能在C

中的开关的参数中传递整数值
int i = 0;
switch(i){
 case 0: // do something if i is 0
 break;
 case 1: // do something if i is 1
 break;
 default: // if no case matched run code in default
 break;
}

但是你可以使用一些hack,例如在开关中传递 char ,这将在后端转换为 int ASCII

char *choice[]={'option1', 'option2'}
switch(choice[0][0]){
 case 'o': // the first array element with 'o'
 break;
}