有什么方法可以 "destringify" 输入,这样它就可以像标识符一样使用了吗?
Is there any way to "destringify" input so it can be used like an identifier?
问题
是否可以 "destringify" 文件中的一行输入以使其类似于变量或标识符?一个例子可能有助于说明我的意思:
// A few functions, definitions of these don't matter in this example.
void func1();
void func2();
void func3();
// Main function reading a line in from the user
int main() {
char input[8];
fgets( input, 8, stdin );
/* Pretend the newline has been stripped already */
void(*fn_ptr)();
fn_ptr = destringify( input );
fn_ptr();
return;
}
基本上,使用上面的示例,我想问我如何 "destringify" 输入以便 fn_ptr 指向正确的函数(func1、func2 或 func3)?这样的函数会很有用,因为它允许我让用户选择使用哪个函数,同时能够使用单个函数指针。
约束
- 查找 table 很难实现,因为我计划让用户创建自己的函数,但如果这是唯一的解决方案,那没关系。
- 出于同样的原因,我更愿意避免
switch...case
和 if...else
。
没有独立于平台的方法可以在 C 中自动执行此操作。不过,您可以使用一些选项。
许多操作系统支持特定功能来查找给定函数名称的函数地址。例如,在 Windows 中,您可以使用 LoadLibrary
和 GetProcAddress
来执行此操作。这使您的代码更少 portable,但可能正是您正在寻找的。 (这也是一个巨大的安全问题,但这是另一回事。)
另一种选择是创建某种散列 table 或 BST,将字符串集合与函数指针相关联。然后,您可以通过读取用户的输入、在散列 table/BST 中查找该字符串,然后调用调用的函数指针,让用户指定要调用的函数。您需要确保手动填充散列 table 或 BST,这是额外的工作,但也让您可以控制可以调用的函数。
希望对您有所帮助!
问题
是否可以 "destringify" 文件中的一行输入以使其类似于变量或标识符?一个例子可能有助于说明我的意思:
// A few functions, definitions of these don't matter in this example.
void func1();
void func2();
void func3();
// Main function reading a line in from the user
int main() {
char input[8];
fgets( input, 8, stdin );
/* Pretend the newline has been stripped already */
void(*fn_ptr)();
fn_ptr = destringify( input );
fn_ptr();
return;
}
基本上,使用上面的示例,我想问我如何 "destringify" 输入以便 fn_ptr 指向正确的函数(func1、func2 或 func3)?这样的函数会很有用,因为它允许我让用户选择使用哪个函数,同时能够使用单个函数指针。
约束
- 查找 table 很难实现,因为我计划让用户创建自己的函数,但如果这是唯一的解决方案,那没关系。
- 出于同样的原因,我更愿意避免
switch...case
和if...else
。
没有独立于平台的方法可以在 C 中自动执行此操作。不过,您可以使用一些选项。
许多操作系统支持特定功能来查找给定函数名称的函数地址。例如,在 Windows 中,您可以使用
LoadLibrary
和GetProcAddress
来执行此操作。这使您的代码更少 portable,但可能正是您正在寻找的。 (这也是一个巨大的安全问题,但这是另一回事。)另一种选择是创建某种散列 table 或 BST,将字符串集合与函数指针相关联。然后,您可以通过读取用户的输入、在散列 table/BST 中查找该字符串,然后调用调用的函数指针,让用户指定要调用的函数。您需要确保手动填充散列 table 或 BST,这是额外的工作,但也让您可以控制可以调用的函数。
希望对您有所帮助!