st";ls > somefi-6ren">
gpt4 book ai didi

字符分割和解析

转载 作者:行者123 更新时间:2023-11-30 17:49:17 25 4
gpt4 key购买 nike

所以我尝试设置一个函数来正确解析以下类型的输入(请注意,此输入是胡言乱语只是为了尝试说明我的示例)

"./test script";ls -a -o;mkdir "te>st";ls > somefile.txt

每个命令由“;”分隔每个参数都由空格“”分隔,除非它们被包裹在“”中,在这种情况下,它们应该被视为文字或整体。 IE 我想要的输出是

cmd:“./测试脚本”

cmd : ls args[2] {-a, -o}

cmd : mkdir args[1] { "te>st"}

cmd : ls args[2] {>, somefile.txt}

我尝试通过 ; 拆分它首先,然后通过“”,但第一个示例失败(用“”包裹,所以应该被认为是完整的),我在使用 c 时遇到了一些麻烦,因为我不太熟悉这门语言,有人可以帮忙吗?这就是我到目前为止所拥有的

    // Commands split with ; 
char *cmdSplitToken = strtok(srcPointer, ";");

// Store commands seperately so we can deal with them one by one
while(cmdSplitToken != NULL) {
cmds[cmdCount++] = cmdSplitToken;
cmdSplitToken = strtok(NULL, ";");
}

// Loop over commands and gather arguments
for(int i = 0; i < cmdCount; i++) {
// args split with ' '
char *argSplitToken = strtok(cmds[i], " ");
int argCount = 0;
while(argSplitToken != NULL) {
printf("arg %s\n", argSplitToken);
argCount++;
argSplitToken = strtok(NULL, " ");
}
}

最佳答案

推出您自己的 strtok 并检查其中的引号。 (您的示例字符串不包含任何引号内的“;”,所以也许我误解了整个问题:)

无论如何,这是我对 strtok 的粗略版本的看法,其工作原理类似,只是它只接受一个标记字符而不是字符串(但如果需要,可以轻松添加)并且它对以下内容进行元解析:

  • " 开头的字符串与结束的 "
  • ' 开头的字符串与结束的 '
  • 任何单个字符都可以通过在前面添加 \
  • 进行转义

不匹配的 "' 将简单地匹配直到字符串末尾的所有内容。

#include <stdio.h>

char *get_token (char *input_str, char separator)
{
static char *last_pos;

if (input_str)
last_pos = input_str;
else
input_str = last_pos;

if (last_pos && *last_pos)
{
while (*last_pos)
{
if (*last_pos == separator)
{
*last_pos = 0;
last_pos++;
return input_str;
}
if (*last_pos == '\"')
{
last_pos++;
while (*last_pos && *last_pos != '\"')
last_pos++;
} else
if (*last_pos == '\'')
{
last_pos++;
while (*last_pos && *last_pos != '\'')
last_pos++;
} else
if (*last_pos == '\\' && last_pos[1])
{
last_pos++;
}
last_pos++;
}
return input_str;
}
return NULL;
}

void main (void)
{
char str[] = "\"./test; script\";ls -a\\;b -o;mkdir \"te>st\";ls > 'some;file.txt'";
char *cmdSplitToken = get_token (str, ';');

while (cmdSplitToken != NULL)
{
printf("arg %s\n", cmdSplitToken);
cmdSplitToken = get_token (NULL, ';');
}
}

这仅修复了命令解析的前半部分。第二部分可以使用相同的例程来处理,或者——据我所知——使用 bog 标准 strtok

顺便说一句,我的例程中的静态字符使其不可重入——请勿将其与交替字符串一起使用。 (可能您已经知道这一点,因为您也在自己的代码中避免了它。)

关于字符分割和解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17962018/

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