c++ - 如何创建参数标记(Unix 中的 C++)

标签 c++ bash

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

我的问题是我无法弄清楚如何将该命令数组的其余部分切分以从中获取参数并将它们传递给 execlp() (或 execvp 或你们可能在 exec* 家族中提出的任何建议).有什么想法吗?

谢谢!

最佳答案

首先,如果您不必使用 strtok(),则应使用为您进行参数解析的高级库。

话虽这么说,但您应该如何解析这样的字符串:“command arg1 arg2 arg3...”(以空格分隔)。

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

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

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

但由于这是最常见的操作,strtok() 使这变得容易得多。如果您传入一个 NULL 指针,它会假定这正是您想要执行的操作,并将 NULL 指针视为您传递了一个指向“arg1”的指针。

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

希望对您有所帮助。

关于c++ - 如何创建参数标记(Unix 中的 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473175/

相关文章:

c++ - 在 VC++ 中获取屏幕截图的位图对象

c++ - OpenCV 图像放大

linux - 如何grep这个包含等号的字符串?

c++ - C++ 不等式中的逻辑。 If Else 语句

c++ - 为什么一个简单的 C++ 程序会出现错误的结果?是#define引起的吗?

bash - 子外壳中的源无法按预期工作

python - 使用Makefile bash保存python文件的内容

regex - 如何在 bash 脚本中匹配正则表达式中的数字

c++ - 位图作为 MDI mainfrm 的背景

.net - 如何从docker容器中的bash检查.net核心dll的版本