C 为每个命令实现一个没有条件的菜单式设备

C 为每个命令实现一个没有条件的菜单式设备,c,C,假设我试图实现一个“菜单”,它要求用户输入一个命令,然后调用执行该命令的函数。我决定声明一个包含每个命令名的字符串数组,然后将用户的输入与该数组中的字符串进行比较,以了解下一步要做什么,而不是为每个命令指定一个条件块 比如: char* commands[] = {"cmd", "cmd1", "cmd2"}; 然后: while(strcmp(cmd,“end”)!=MATCH){ printf(“?:”); scanf(“%s”,cmd); 对于(i=0;i

假设我试图实现一个“菜单”,它要求用户输入一个命令,然后调用执行该命令的函数。我决定声明一个包含每个命令名的字符串数组,然后将用户的输入与该数组中的字符串进行比较,以了解下一步要做什么,而不是为每个命令指定一个条件块

比如:

char* commands[] = {"cmd", "cmd1", "cmd2"};
然后:

while(strcmp(cmd,“end”)!=MATCH){
printf(“?:”);
scanf(“%s”,cmd);
对于(i=0;i

有没有一种方法可以在没有任何条件或switch语句的情况下调用函数?我想实现一个函数指针的结构,每个命令都有一个成员,然后使用它,但我不确定如何实现,或者是否可能实现

创建一个包含命令和函数指针的结构:

typedef struct {
    char * cmd;
    void (* func)();
} Command_t;

Command_t commands[] = {
    "cmd", func_cmd,
    "cmd2", func_cmd2
};
注意:你需要声明这个结构上面的函数,否则你的编译器会犹豫

(编辑)为了完整起见,您可以将此结构用作

for(i = 0; i < sizeof(commands)/sizeof(commands[0]); i++)
{
    if(!strcmp(cmd, commands[i].cmd))
    {
        commands[i].func();
        break;
    }
}
for(i=0;i
谢谢!我有点好奇函数的地址是如何分配的,更具体地说,我想我想知道链接器什么时候为函数分配内存地址,然后在这样的数组初始化中如何发挥作用?它就是这样。函数名在这方面没有什么特别之处。
for(i = 0; i < sizeof(commands)/sizeof(commands[0]); i++)
{
    if(!strcmp(cmd, commands[i].cmd))
    {
        commands[i].func();
        break;
    }
}