函数指针数组

时间:2015-03-24 16:13:20

标签: c

是否可以替换所有这些"如果,如果..."在这个代码示例中有一个函数指针数组?

  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;

3 个答案:

答案 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作为字符串键
  • 将函数指针用作值