Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 通过“字符串”调用函数_C - Fatal编程技术网

C 通过“字符串”调用函数

C 通过“字符串”调用函数,c,C,我想知道是否有可能这样做: call("MyFunction"); 并让它调用名为MyFunction的函数,而不让调用实现长开关或if语句 可能还有其他方法可以做到这一点,我真正想要实现的是实现IRC协议,它获取消息,并基于这些消息,我想调用apropiate函数 我对C和最佳实践都是新手,所以请启发我 没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是非常高级的黑客技术。没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是

我想知道是否有可能这样做:

 call("MyFunction");
并让它调用名为MyFunction的函数,而不让调用实现长开关或if语句

可能还有其他方法可以做到这一点,我真正想要实现的是实现IRC协议,它获取消息,并基于这些消息,我想调用apropiate函数


我对C和最佳实践都是新手,所以请启发我

没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是非常高级的黑客技术。

没有定义字符串到函数的映射表,可能还有某种参数传递约定,或者使用dlopen,这算是非常高级的黑客行为。

不是C现成的。你可以有一个哈希映射或字典,其中字符串作为键和函数指针。您可以使用字符串键在字典中查找,然后调用函数指针。

不是C现成的。您可以使用哈希映射或字典,将字符串作为键和函数指针。您可以使用string键在字典中查找,然后调用函数指针。

无法像在标准C库中那样直接按字符串调用函数。如果是C++,可以创建一个字符串为函数指针的STD::MAP,但在C.中,如果C++不是选项,则可能需要求助于一系列STRCMP。
/* These are your handler functions */
void user_fn() { printf("USER fn\n"); }
void pass_fn() { printf("PASS fn\n"); }

/* Stores a C string together with a function pointer */
typedef struct fn_table_entry {
    char *name;
    void (*fn)();
} fn_table_entry_t;

/* These are the functions to call for each command */
fn_table_entry_t fn_table[] = {{"USER", user_fn}, {"PASS", pass_fn}};

/* fn_lookup is a function that returns the pointer to the function for the given name. 
   Returns NULL if the function is not found or if the name is NULL. */
void (*fn_lookup(const char *fn_name))() {
    int i;

    if (!fn_name) {
        return NULL;
    }
    for (i = 0; i < sizeof(fn_table)/sizeof(fn_table[0]); ++i) {
        if (!strcmp(fn_name, fn_table[i].name)) {
            return fn_table[i].fn;
        }
    }
    return NULL;
}

int main() {
    fn_lookup("USER")();
    fn_lookup("PASS")();
}

在标准C库中,无法像您希望的那样通过字符串直接调用函数。如果是C++,可以创建一个字符串为函数指针的STD::MAP,但在C.中,如果C++不是选项,则可能需要求助于一系列STRCMP。
/* These are your handler functions */
void user_fn() { printf("USER fn\n"); }
void pass_fn() { printf("PASS fn\n"); }

/* Stores a C string together with a function pointer */
typedef struct fn_table_entry {
    char *name;
    void (*fn)();
} fn_table_entry_t;

/* These are the functions to call for each command */
fn_table_entry_t fn_table[] = {{"USER", user_fn}, {"PASS", pass_fn}};

/* fn_lookup is a function that returns the pointer to the function for the given name. 
   Returns NULL if the function is not found or if the name is NULL. */
void (*fn_lookup(const char *fn_name))() {
    int i;

    if (!fn_name) {
        return NULL;
    }
    for (i = 0; i < sizeof(fn_table)/sizeof(fn_table[0]); ++i) {
        if (!strcmp(fn_name, fn_table[i].name)) {
            return fn_table[i].fn;
        }
    }
    return NULL;
}

int main() {
    fn_lookup("USER")();
    fn_lookup("PASS")();
}

创建一个表,将每个字符串与函数指针关联起来。然后在表中查找字符串,并通过指针调用函数。经典的K&R文本包含类似这样的代码。

您可以创建一个表,将每个字符串与函数指针关联起来。然后在表中查找字符串,并通过指针调用函数。经典的K&R文本包含类似这样的代码。

我不是C程序员,我个人会用动态语言编写IRC,但您可以执行以下操作:


创建一个包含字符串字段和函数指针的结构,用字符串创建一个包含所有函数的数组,按字符串排序。调用时,按字符串对数组进行二进制搜索,并在找到的结构中调用函数指针。

我不是C程序员,个人会用动态语言进行IRC操作,但您可以执行以下操作:


创建一个包含字符串字段和函数指针的结构,用字符串创建一个包含所有函数的数组,按字符串排序。调用时,按字符串对数组进行二进制搜索,并在找到的结构中调用函数指针。

我也会这样做,尽管这主要是出于教育目的。我也会这样做,尽管这主要是出于教育目的。感谢所有反馈,我想我会使用tablelookup,类似于下面来自User470379的代码可能重复感谢所有反馈,我想我会使用tablelookup,类似于下面来自User470379的代码可能重复