2012-10-07 171 views
1

所以,我正在制作一个Unix minishell,并且遇到了障碍。我需要能够执行内置函数,所以我提出的函数:C映射字符串到函数

int exec_if_built_in(char **args) 

它需要一个字符串数组(第一个是命令,和其余为参数)。对于非内置命令,我只需使用像execvp这样的东西,但是我需要找到一种将第一个字符串映射到函数的方法。我正在考虑制作两个数组,一个字符串,另一个使用相应的函数指针。但是,由于这些功能中的许多功能会有所不同(返回并接受不同的事物),所以这种方法将不起作用。我也想过使用一个名称属性和一个函数指针属性来创建一个结构数组,但是再一次由于我将使用的函数的性质不同,这是行不通的。

那么,基于字符串输入来执行函数的最佳方法是什么?如何将字符串映射到某个函数?我不太熟悉函数指针,所以我可能会错过一些东西。

谢谢你们的帮助:)

+1

该ptr-ptr上的任何边界?即有没有一个argc符合那个?我认为你可能迟早会需要一个,特别是如果命令有参数并且你想验证它们。 – WhozCraig

+0

我对你所问的有点困惑。有1024个字符的限制可以传递到shell。我分解了用户输入到字符串数组中的字符串。我可以很好地构建函数,我只需要找到一种方法来调用与其字符串关联的函数。 – robins35

回答

3

我想使两个数组,字符串中的一个,而另一个与它们对应的函数指针。

这是正确的做法。使包含相同类型参数的包装函数*然后从包装器中调用“真实”函数。

如果您想“为样式赢得更多积分”,请按字母顺序排序字符串数组,并对字符串数组使用二进制搜索。这会让你在两个阵列变大时节省几个CPU周期。


*也许你可以使用char **,因为这是你的exec_if_built_in需要什么。

+1

+1:非常合身。 – WhozCraig

+0

哦,但它的回报值呢?做好解决任何事情的方法。 我不太明白什么是相同的类型*,或者什么是实际功能。 – robins35

+1

@Scriptonaut这里有一个星号可以引导你关注'char **'的脚注。就返回类型而言,确保它们都返回相同的东西。 'int'听起来很不错。本质上,你的'exec_if_built_in'将是第一级调度:它将按名称选择一个命令,并将控制传递给实现它的包装器。包装器可以根据需要使用真实函数,并返回一个'int',这个'exec_if_built_in'将返回给它的调用者。每个命令都有自己的能够执行该命令的包装器。 – dasblinkenlight

1

如果你的情况不同,所以表驱动的做法是不恰当的,那么也许一个if/else语句,如果级联是最好的解决方案。

if(!strcmp(args[0], "cat")) { 
    /* cat a file */ 
} else if(!strcmp(args[0], "dog")) { 
    /* dog a file */ 
} else if(!strcmp(args[0], "echo")) { 
    /* create an echo chamber */ 
} ... 
+0

问题是找不到匹配的字符串,这就是我一旦找到匹配就执行该函数的方式。我错过了什么吗? – robins35

+1

在这里,您只需将函数调用它说'/ *猫文件* /'... – nneonneo

+0

这是我可以完全实现的,但是我的任务(我是一个CS专业)说要避免if/else - 如果级联。如果我想不出更优雅的东西(我不会被扣除),我仍会这样做。 说真的,谢谢你的帮助。过去11个小时,我一直在撞墙。 – robins35