我想写一个从stdin:scanf("%s %s", foo, args);
读取数据的程序,然后用参数:foo(args);
运行函数foo(以前在程序中定义过),我不知道如何在C中实现这一点。我以前在Shell中很容易做到这一点,但在C语言中似乎很难做到
最佳答案
这个问题没有一个统一的、跨平台/标准的解决方案。
不依赖非标准扩展的非通用解决方案:在数组中存储名称和函数指针对、执行搜索、逐指针调用函数。例如:
struct namedfunc {
const char *name;
void (*fptr)(void);
} fvect[3] = {
{ "foo", foo_impl },
{ "bar", bar_impl },
{ "baz", baz_impl }
};
char buf[0x100];
fgets(buf, sizeof buf, stdin);
char *p = strchr(buf, '\n');
if (p != NULL)
*p = 0;
for (size_t i = 0; i < sizeof fvect / sizeof fvect[0]; i++) {
if (strcmp(buf, fvect[i].name) == 0) {
fvect[i].fptr();
break;
}
}
依赖于动态加载的更通用的解决方案是:使用
dlopen()
API,如下所示:void *hndl = dlopen(RTLD_SELF, RTLD_LAZY); // try NULL if RTLD_SELF doesn't work
void (*fptr)(void) = dlsym(hndl, buf);
if (fptr != NULL)
fptr();
dlclose(hndl);
关于c - 如何从STDIN读取C函数并在程序中运行它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19098778/