在C语言中,处理多个命令而不是switch语句的合适方法是什么

在C语言中,处理多个命令而不是switch语句的合适方法是什么,c,C,我有第一个程序,它通过Linux中的SystemV消息队列处理来自其他第二个程序的命令 我所做的是 1-(在第二个程序中)将命令发送到System V消息队列中 2-(在第一个程序中)读取SystemV消息队列中的消息,然后将字符串格式的命令转换为整数值,以便使用switch语句 3-基于我调用的相应函数的值 但这太难处理每一个命令了 那么,解决这个大开关语句的最佳方法是什么呢?如果您有一些命令,一个简单的If/elsif就可以了 enum commands cmd_num = UNKNOWN_

我有第一个程序,它通过Linux中的SystemV消息队列处理来自其他第二个程序的命令

我所做的是

1-(在第二个程序中)将命令发送到System V消息队列中

2-(在第一个程序中)读取SystemV消息队列中的消息,然后将字符串格式的命令转换为整数值,以便使用switch语句

3-基于我调用的相应函数的值

但这太难处理每一个命令了


那么,解决这个大开关语句的最佳方法是什么呢?

如果您有一些命令,一个简单的If/elsif就可以了

enum commands cmd_num = UNKNOWN_COMMAND;

if( strcmp(cmd_string, "this") ) {
    cmd_num = THIS_COMMAND;
}
else if( strcmp(cmd_string, "that") ) {
    cmd_num = THAT_COMMAND;
}
else {
    fprintf(stderr, "Unknown command: %s", cmd_string);
}

switch(cmd_num) {
  case THIS_COMMAND:
    this();
    break;
  case THAT_COMMAND:
    that();
    break;
  default:
    fprintf(stderr, "Unknown command #%d", cmd_num);
}
但是为什么不删掉中间人呢

if( strcmp(cmd_string, "this") ) {
    this();
elsif( strcmp(cmd_string, "that") ) {
    that();
}
else {
    fprintf("Unknown command: %s", cmd_string);
}
如果您计划使用大量命令,可以将它们放入一个列表中,以便于添加和查找。键是命令字符串。该值可以是一个整数,使用单独的switch语句(或另一个哈希表)来运行该命令

或者,再一次,我们可以去掉中间人,使其成为函数指针

#include <stdio.h>
#include <gmodule.h>

void this() {
    puts("this");
}

void that() {
    puts("that");
}

GHashTable *init_commands() {
    return g_hash_table_new( g_str_hash, g_str_equal );
}

void add_command(GHashTable *commands, const char *command, void(*func_ptr)(void)) {
    g_hash_table_insert(commands, g_strdup(command), (void *)func_ptr);
}

void run_command(GHashTable *commands, const char *command) {
    void(*func_ptr)(void) = g_hash_table_lookup(commands, command);
    if( func_ptr ) {
        (*func_ptr)();
    }
    else {
        fprintf(stderr, "Unknown command: %s", command);
    }
}

int main() {    
    GHashTable *commands = init_commands();
    add_command(commands, "this", this);
    add_command(commands, "that", that);

    run_command(commands, "this");
}
#包括
#包括
作废这个(){
出售(“本”);
}
作废{
出售(“该”);
}
GHashTable*init_命令(){
返回g_哈希表(g_str_hash,g_str_equal);
}
void add_命令(GHashTable*命令、const char*命令、void(*func_ptr)(void)){
g_哈希表插入(命令,g_strdup(命令),(void*)func_ptr);
}
void run_命令(GHashTable*命令、const char*命令){
void(*func_ptr)(void)=g_hash_table_lookup(命令,命令);
如果(函数ptr){
(*func_ptr)();
}
否则{
fprintf(stderr,“未知命令:%s”,命令);
}
}
int main(){
GHashTable*commands=init_commands();
添加_命令(命令“this”,this);
添加命令(命令“that”,that);
运行_命令(命令,“this”);
}

取舍是所有命令现在必须具有相同的签名。这对于远程命令处理程序来说很常见,但需要一些时间才能习惯。你选择哪种方式取决于你的项目如何运作。

我会坚持转换+大开关道路。如果您首先填充一个静态数组,将包含所有接受命令的字符串与要在交换机中使用的枚举项在每个项中进行匹配,那么转换就不会那么困难。另一种方法是将字符串映射到函数的结构数组。你扫描数组寻找匹配的字符串,然后调用相应的函数。你有多少个命令?有30多个命令,所以正如我所说的,使用switch语句不是一个好的解决方案,搜索整个数组也需要O(n),使用if/else或switch语句是处理少数命令的好方法是简单的,但是当有很多命令时,它可能会增长,这不是一个好的做法,我听说哈希表是搜索项目的最佳结构。是否有推荐的文章或资源对此进行解释?@root_uu性能方面,交换机通常会对任意数量的选项执行相同的操作,而if/elseif在检查每个条件时会变慢。哈希表是一种基本的数据结构,任何关于C中数据结构的好书或文章都会涉及哈希表。也许可以试试。非常感谢你的推荐视频,它非常有帮助并且容易理解