是否可以替换所有这些"如果,如果..."在这个代码示例中有一个函数指针数组?
if (strncmp(buff, "ls\n", 3) == 0)
my_ls();
else if (strncmp(buff, "cd\n", 3) == 0)
my_cd();
else if (strncmp(buff, "user\n", 5) == 0)
my_user();
else if (strncmp(buff, "pwd\n", 4) == 0)
my_pwd();
else if (strncmp(buff, "quit\n", 5) == 0)
my_quit();
我试图得到这样的东西:
void (*tab[5]) (void);
tab[0] = &my_ls;
tab[1] = &my_cd;
tab[2] = &my_user;
tab[3] = &my_pwd;
tab[4] = &my_quit;
答案 0 :(得分:1)
我创建了一个代码来说明你想要做什么,因为我很有趣。
#include <stdio.h>
#include <string.h>
// your functions
void my_ls() { puts("fun:my_ls") ;}
void my_cd() { puts("fun:my_cd") ;}
void my_user(){ puts("fun:my_user");}
void my_pwd() { puts("fun:my_pwd") ;}
void my_quit(){ puts("fun:my_quit");}
int main(int argc, char const *argv[])
{
char* buff="ls\n"; // the string you have to compare
void (*tab[5]) (void)={my_ls,my_cd,my_user,my_pwd,my_quit};
char *names[5]={"ls\n","cd\n","user\n","pwd\n","quit\n"};
int i;
for (i=0; i<5; i++)
{
if(strncmp(buff,names[i],strlen(names[i]) )==0){
tab[i]();
return 0;
}
}
return 0;
}
还有其他方法可以写它。实际上my_function
与&my_function
相同,因为仅将函数名称转换为函数的地址。
同样tab[i]()
相当于(*tab[i])()
......这些都是奇怪的行为,但我认为它是由C标准指定的
答案 1 :(得分:1)
函数指针数组没有问题,但您需要将boolean strncmp()结果序列转换为单个索引。
如果列表很长,哈希表的想法可能会成为赢家。对于紧凑,简单的代码和易于维护,我使用了一系列结构:
typedef struct cmdtable_t
{
void (*fptr)();
unsigned char length
char name[11];
} cmdtable_t, *pcmdtable_t;
cmd_table_t commands = {
{ my_ls, 2, "ls"},
{ my_cd, 2, "cd" },
{ my_user, 4, "user" },
...etc.
};
这也可能是哈希表条目的样子,可以提前排序以允许二进制搜索,或者只是顺序搜索KISS版本,直到你发现它是否需要优化。
答案 2 :(得分:0)
我想你想要一本字典或hashtable:
buff
作为字符串键