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)
你不能 - 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()用于快速匹配.
你只能打开整数,所以这不起作用.
如果您所做的只是将字符串转换为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)
| 归档时间: |
|
| 查看次数: |
3794 次 |
| 最近记录: |