我不喜欢重新发明轮子。
是否有标准或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);
编辑: 谢谢你的回复。看起来没有一步功能可以完成上述任务。
答案 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中实现的,而不是在标准库中实现的。您可以调用system
或popen
,它们是fork
和exec
的包装器来运行带有字符串的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