gpt4 book ai didi

c++ - 模仿 C++ 中的 shell 参数解析器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:48 24 4
gpt4 key购买 nike

我一直在研究一个模拟 shell 终端的程序,我遇到了一个比我预期的更难的实现问题。基本上,我正在尝试拆分参数,就像 shell 传递给其可执行文件的方式一样。所以,想象一下这样的输入:

$> ./foo some arguments

人们会期望传递给程序的参数是一个数组,例如(假设使用 C/C++):

char ** argv = {"foo", "some" "arguments"}

但是,如果参数是:

$> ./foo "My name is foo" bar

数组将是:

char ** argv = {"foo", "My name is foo", "bar"}

任何人都可以建议一种有效的方法来实现这一点,这样的界面是这样的:

vector<string> splitArgs(string allArgs);string[] splitArgs(string allArgs);

当然,我可以简单地在“阅读单词”/“阅读引用文本”状态之间迭代和切换,但我觉得这并没有达到预期的效果。我也玩过 regex 的想法,但我对如何在 C++ 中完成它还不够熟悉。对于这个项目,我确实也安装了 boost 库,如果有帮助的话。

谢谢!RR

最佳答案

为此,我有时仍会使用这个普通的 C 实用程序函数。我主要在标准库非常有限的嵌入式系统上使用它,因此可以使用标准库控件更改大部分代码以提高效率,但基本技术应该保持不变,标记字符串的引号部分在解析之前,只需通过拆分标记将字符串分解为单独的标记,最后从各个部分中删除引号。

/**
* Split a line into separate words.
*/
static void splitLine(char *pLine, char **pArgs) {
char *pTmp = strchr(pLine, ' ');

if (pTmp) {
*pTmp = '\0';
pTmp++;
while ((*pTmp) && (*pTmp == ' ')) {
pTmp++;
}
if (*pTmp == '\0') {
pTmp = NULL;
}
}
*pArgs = pTmp;
}



/**
* Breaks up a line into multiple arguments.
*
* @param io_pLine Line to be broken up.
* @param o_pArgc Number of components found.
* @param io_pargc Array of individual components
*/
static void parseArguments(char *io_pLine, int *o_pArgc, char **o_pArgv) {
char *pNext = io_pLine;
size_t i;
int j;
int quoted = 0;
size_t len = strlen(io_pLine);

// Protect spaces inside quotes, but lose the quotes
for(i = 0; i < len; i++) {
if ((!quoted) && ('"' == io_pLine[i])) {
quoted = 1;
io_pLine[i] = ' ';
} else if ((quoted) && ('"' == io_pLine[i])) {
quoted = 0;
io_pLine[i] = ' ';
} else if ((quoted) && (' ' == io_pLine[i])) {
io_pLine[i] = '\1';
}
}

// init
MY_memset(o_pArgv, 0x00, sizeof(char*) * C_MAXARGS);
*o_pArgc = 1;
o_pArgv[0] = io_pLine;

while ((NULL != pNext) && (*o_pArgc < C_MAXARGS)) {
splitLine(pNext, &(o_pArgv[*o_pArgc]));
pNext = o_pArgv[*o_pArgc];

if (NULL != o_pArgv[*o_pArgc]) {
*o_pArgc += 1;
}
}

for(j = 0; j < *o_pArgc; j++) {
len = strlen(o_pArgv[j]);
for(i = 0; i < len; i++) {
if('\1' == o_pArgv[j][i]) {
o_pArgv[j][i] = ' ';
}
}
}
}

关于c++ - 模仿 C++ 中的 shell 参数解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5534620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com