我有一個問題,我無法將這個 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;
}
回傳動作;}
有沒有辦法更好地寫這個?
有沒有辦法更好地寫這個?
uj5u.com熱心網友回復:
如果所有字串“send”、“list”等的長度相同,則可以通過將字串資料視為整數來執行 switch 陳述句。
但是,由于您有兩個不同的長度 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”,這將消除單獨識別大寫/小寫的需要。
uj5u.com熱心網友回復:
您可以執行以下操作:
#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 = %d\n", *argv, action);
}
return 0;
}
請注意,這映射SEND為零,因此如果您想與原始代碼中的操作保持一致,請添加 1,或者移動陣列,或者...
uj5u.com熱心網友回復:
如果buffer包含字串(以空字符結尾的字符陣列)并且比較可以真正區分大小寫,則可以宣告動作名稱陣列并在其中搜索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”和“SEND”,還匹配“Send”、“send”等。
uj5u.com熱心網友回復:
#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因為它不是標準的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/524342.html
