从C字符串构建参数列表

时间:2012-02-14 20:38:32

标签: c linux

我不喜欢重新发明轮子。

是否有标准或Linux特定的函数来转换C样式字符串(char *) 一个char **样式的字符串格式数组,如传递给main?

即。给出:

const char* s = "-n file -m -o output"

将其动态转换为:

char** args = { "-n", "file", "-m", "-o", "output", 0 };

类似的功能:

char** build_arg_array(const char* cmd_line); 

编辑: 谢谢你的回复。看起来没有一步功能可以完成上述任务。

4 个答案:

答案 0 :(得分:1)

这不太难:

char **split(char *input, char splitChar, int *outCount)
{
    int inputLen = (int) strlen(input);
    int numberOfArguments = 1;

    for (int i = 0; i < inputLen; i++)
    {
        if (input[i] == splitChar)
            numberOfArguments++;
    }

    *outCount = numberOfArguments;
    char **output = malloc(sizeof(char *) * numberOfArguments);

    int startOfArg = 0; 
    int outputIndex = 0;

    for (int i = 0; i < inputLen; i++)
    {
        if (input[i] == splitChar)
        {
            int argLen = i - startOfArg;
            output[outputIndex] = malloc(sizeof(char) * argLen + 1);
            strncpy(output[outputIndex], input + startOfArg, argLen);
            output[outputIndex][argLen] = 0;     

            startOfArg = i + 1;
            outputIndex++;
        }
    }

    // append the last argument
    int argLen = inputLen - startOfArg;
    output[outputIndex] = malloc(sizeof(char) * argLen + 1);
    strncpy(output[outputIndex], input + startOfArg, argLen);
    output[outputIndex][argLen] = 0;

    return output;
}

答案 1 :(得分:0)

重新发明轮子。

如果我正确理解你的问题,你想在Python,Perl和其他语言中实现类似split()函数的东西。我知道在C中没有这样的东西,但你也可以自己写一个。

答案 2 :(得分:0)

在类Unix系统上,它是执行参数解析的shell。因此,您的shell将应用其所有参数拆分,通配符扩展,引用和重定向逻辑,生成参数数组,分叉新进程,并调用execve(或其他exec变体之一)及其解析结果。

所以不,没有标准库调用以shell的方式解析参数,因为该逻辑是在shell中实现的,而不是在标准库中实现的。您可以调用systempopen,它们是forkexec的包装器来运行带有字符串的shell命令,或者您可以使用{自己调用shell {1}}和fork

当然,您遇到了将可能不受信任的输入传递给shell的所有问题,并且您必须设计一种将结果传回给父进程的方法,可能使用exec来打开管道读取您启动的命令的结果,它将空分隔的参数打印到标准输出。

除此之外,如果您不想生成新进程并且只想解析程序中的参数,则必须实现自己的解析器。

答案 3 :(得分:0)

gtk glib库可以被认为是C的标准,它具有您正在寻找的功能(或非常接近):g_strsplit
http://www.gtk.org/api/2.6/glib/glib-String-Utility-Functions.html#g-strsplit