c-将if语句转换为switchcase



我遇到的问题是,我无法将if语句转换为switch case函数。该函数获取一个值SEND、LIST、READ、DEL、Quit,然后应该发生其他事情

int getCommand(char*buffer({

int action = 0;

if((buffer[0] == 's' && buffer[1] == 'e' && buffer[2] == 'n' && buffer[3] == 'd')
|| (buffer[0] == 'S' && buffer[1] == 'E' && buffer[2] == 'N' && buffer[3] == 'D')){
action = 1;
}
else if((buffer[0] == 'l' && buffer[1] == 'i' && buffer[2] == 's' && buffer[3] == 't')
|| (buffer[0] == 'L' && buffer[1] == 'I' && buffer[2] == 'S' && buffer[3] == 'T')){
action = 2;
}
else if((buffer[0] == 'r' && buffer[1] == 'e' && buffer[2] == 'a' && buffer[3] == 'd')
|| (buffer[0] == 'R' && buffer[1] == 'E' && buffer[2] == 'A' && buffer[3] == 'D')){
action = 3;
}
else if((buffer[0] == 'd' && buffer[1] == 'e' && buffer[2] == 'l')
|| (buffer[0] == 'D' && buffer[1] == 'E' && buffer[2] == 'L')){
action = 4;
}
else if((buffer[0] == 'q' && buffer[1] == 'u' && buffer[2] == 'i' && buffer[3] == 't')
|| (buffer[0] == 'Q' && buffer[1] == 'U' && buffer[2] == 'I' && buffer[3] == 'T')){
action = 5;
}

回归行动;}

有没有办法写得更好?

有没有办法写得更好?

如果所有字符串"发送"列表";通过将字符串数据视为整数

但是,由于您有两个不同长度的3和4,您需要两个switch语句,这就不太好了。相反,我建议如下。

if (!strncmp(buffer, "send", 4) || !strncmp(buffer, "SEND", 4))
action = 1;
else if (!strncmp(buffer, "list", 4) || !strncmp(buffer, "LIST", 4))
action = 2;
else if (!strncmp(buffer, "read", 4) || !strncmp(buffer, "READ", 4))
action = 3;
else if (!strncmp(buffer, "del", 3) || !strncmp(buffer, "DEL", 3))
action = 4;
else if (!strncmp(buffer, "quit", 4) || !strncmp(buffer, "QUIT", 4))
action = 5;

请注意,还有strnicmp,它不区分大小写,将匹配例如";SeNd";,这将消除区分大小写的需要。

您可以执行以下操作:

#include <string.h>
#include <stdio.h>
char *actions[] = { "SEND", "LIST","READ", "DEL", "Quit" };
int
main(int argc, char **argv)
{
(void)argc;
for( argv += 1; *argv; argv += 1 ){
int action = -1;
for( int i = 0; i < sizeof actions / sizeof *actions; i += 1 ){
if( strcasecmp(*argv, actions[i]) == 0 ){
action = i;
break;
}
}
printf("for %s, action = %dn", *argv, action);
}
return 0;
}

请注意,这会将SEND映射为零,所以如果您希望与原始代码中的操作一致,或者移动数组,或者。。。

如果buffer包含字符串(以null结尾的字符数组(,并且比较可以真正不区分大小写,则可以声明操作名称数组,并使用strcasecmp():在其中进行搜索

int action = 0;
const struct {
const char *name;
int action;
} actions[] = {
{ "send", 1 },
{ "list", 2 },
{ "read", 3 },
{ "del",  4 },
{ "quit", 5 }
};
for (unsigned i = 0; i < sizeof(actions)/sizeof(*actions); ++i)
{
if (strcasecmp(buffer, actions[i].name) == 0)
{
action = actions[i].action;
break;
}
}

注意";发送";将不仅匹配";发送";以及";SEND";而且";发送"seND";等

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* public domain code use at your own wish (only toUpper function) */
char* toUpper(char* s) {
char* str = malloc(strlen(s)+1);
strcpy(str, s);
for(unsigned int i = 0; i < strlen(s); ++i)
str[i] -= 32 * ((str[i] >= 97) && (str[i] <= 122));
return str;
}
unsigned getCommand(char* str) {
char* s = toUpper(str);
unsigned action = 0;
action += 1 * (!strcmp(s, "SEND"));
action += 2 * (!strcmp(s, "LIST"));    
action += 3 * (!strcmp(s, "READ"));    
action += 4 * (!strcmp(s, "DEL"));    
action += 5 * (!strcmp(s, "QUIT"));    
free(s);
return action;
}

另一个版本,主要是无分支的解决方案(除了strcmp,它在内部执行(。并不是每个libc都有strnicmp,因为它不是标准的。

最新更新