c - C 中的 switch 语句

标签 c if-statement switch-statement

我有以下 if 语句:

    if (strcmp(registerName, "zero"))
            return 00000;
    else if (strcmp(registerName, "at"))
        return 00001;
    else if (strcmp(registerName, "v0"))
        return 00010;
    else if (strcmp(registerName, "v1"))
        return 00011;

它实际上很长 - 大约 20 个 if 语句。因此,我想使用一个开关。当每个语句都有不同的条件时,我如何将其转换为 switch?

我尝试了下面的代码,但它不起作用:

int registerAddress;

switch(registerAddress) {

case 1 (strcmp(registerName, "zero")):
        regsiterAddress = 00000;
        break;
case 2 (strcmp(registerName, "at")):
        registerAddress = 00001;
        break;
}

最佳答案

你不能 — C 中的 switch 语句仅适用于原始类型,不适用于字符串。您可以使用哈希表或搜索树来优化匹配,但对于可能不值得麻烦的只有 20 个选项。

为了清理代码,您可以做的是设置一个映射表:

struct str2Num {
    char *str;
    int num;
};

const struct str2Num registerMap[] = {
    { "zero", 00000 },
    { "at", 00001 },
    { "v0", 00010 },
    { "v1", 00011 },
    { NULL, 0 }  /* end marker */
};

然后像这样进行匹配:

int i;
for (i = 0; registerMap[i].str != NULL; i++) {
    if (strcmp(registerName, registerMap[i].str) == 0) {
        return registerMap[i].num;
    }
}
/* handle no-match case here */

事实上,如果您按字母顺序对表格进行排序,您甚至可以使用 bsearch()用于快速匹配。

关于c - C 中的 switch 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7839464/

相关文章:

c - 如何用C关闭GTK窗口

c - 将 simulavr 与 avr-gdb 一起使用时抛出奇怪的异常

java - 如何控制用户输入的内容?

linux - 如何知道bash中文件是否被删除和创建?

javascript - JS - 在 switch 语句中使用多条件案例

java - Java 中的 switch 语句

c - 从txt文件中选择特定部分并放入链接列表中

C - 使用 pthread 重现两个线程之间全局变量的同步问题

javascript - react 条件渲染与状态

java - 在 java 1.6 中以优雅的方式切换字符串