在C中切换语句

dar*_*sky 6 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;
Run Code Online (Sandbox Code Playgroud)

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

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

int registerAddress;

switch(registerAddress) {

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

Ilm*_*nen 8

你不能 - switchC中的语句只适用于原始类型,而不适用于字符串.您可以使用哈希表或搜索树来优化匹配,但只有20个选项可能不值得.

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

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

const struct str2Num registerMap[] = {
    { "zero", 00000 },
    { "at", 00001 },
    { "v0", 00010 },
    { "v1", 00011 },
    { NULL, 0 }  /* end marker */
};
Run Code Online (Sandbox Code Playgroud)

并按照以下方式进行匹配:

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 */
Run Code Online (Sandbox Code Playgroud)

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


nos*_*nos 7

你只能打开整数,所以这不起作用.

如果您所做的只是将字符串转换为int,请将信息存储在数组中并查看它.

struct {
   const char *name;
   int value;
} fooMapping[] = {
     {"zero",0},
     {"at",1}
      ....
};

int foo2value(const char *name)
{
     size_t i;
     for(i = 0; i < sizeof fooMapping/sizeof fooMapping[0]; i++) {
          if(strcmp(name, fooMapping[i].name) == 0) 
             return fooMapping[i].value;

     }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)