如何创建参数令牌(Unix中的C ++)

时间:2009-09-24 17:48:23

标签: c++ bash

我正在尝试用C ++编写一个microshell来在BASH中运行。我使用getline()来读取命令及其参数作为用户输入到保持数组中。我使用strtok()来解析命令数组并返回第一项(用户想要运行的实际命令),并希望使用execlp()来运行所述命令。

我的问题是我无法弄清楚如何对其余的命令数组进行骰子处理以获取其中的参数并将它们传递给execlp()(或execvp或者你们在exec *系列中可能建议的任何内容)。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

首先,如果你不必使用strtok(),你应该使用一个更高级的库来为你解析参数。

话虽如此,这里是你应该如何解析一个字符串:“command arg1 arg2 arg3 ...”(用空格分隔)。

简答: 在字符串上使用strtok()获取字符串的第一部分(命令名称)后,您可以再次调用strtok(),这次传递NULL而不是指向字符串的指针。然后strtok()将返回下一个字符串,即第一个参数,每次调用strtok()都会返回下一个参数,直到没有更多的参数要解析。

<强>解释: strtok()实际上做的是找到你给它的第一个分隔符char(在你的例子中,是一个空格标记)。找到它后,它将它变成一个NULL标记,这意味着,字符串现在只上升到第一个空格(即你有一个指向内存的指针:“command \ 0arg1 arg2 arg3”。因为字符串在第一个终止\ 0,您的指针现在指向一个显示“command”的字符串。)

你现在要做的是将一个指针传递到你的字符串结束的位置,即一个指针指向“a”char的“arg1”,并再次调用strtok(这样arg1和arg2之间的空间现在变为NULL,现在你有一个指向包含单词“command”的字符串的指针。

但由于这是最常见的操作,strtok()使这更容易。如果传入NULL指针,它将假定这正是您想要做的,并将NULL指针视为传递指向“arg1”的指针。

请注意,作为让生活更轻松的另一种方法,strtok()将始终返回它认为你给它的指针(即当传递一个真正的指针时,这就是你得到的,但是当传递一个NULL指针时,你会得到你传入的指针。)

希望有所帮助。

答案 1 :(得分:0)

glib中有一个名为g_shell_parse_argv的函数就是这样做的。应该是一个好的起点(查看tokenize_command_line函数)。