解析串入的argv / argc个 [英] Parse string into argv/argc
问题描述
有没有办法,我可以用它来解析一段文字和argv的和ARGC获得值,如果文本已经通过在命令行上的应用程序一个C库函数?
Is there a C library function that I can use to parse a piece of text and obtain values for argv and argc, as if the text had been passed to an application on the command line?
这并没有在Windows,Linux的刚刚工作 - 我也不在乎的参数报价
This doesn't have to work on Windows, just Linux - I also don't care about quoting of arguments.
推荐答案
如果油嘴滑舌的解决方案是矫枉过正你的情况,你可以考虑编写代码,你自己。
If glib solution is overkill for your case you may consider coding one yourself.
然后,您可以:
- 扫描字符串,算多少参数有(你会得到你的argc)
- 分配的char *数组(您的argv)
- 重新扫描字符串,分配的阵列中分配的指针,取而代之的空间'\\ 0'(如果你不能修改包含参数字符串,应复制它)。
- 请不要忘了在你分配什么!
下图应澄清(希望):
aa bbb ccc "dd d" ee <- original string
aa0bbb0ccc00dd d00ee0 <- transformed string
| | | | |
argv[0] __/ / / / /
argv[1] ____/ / / /
argv[2] _______/ / /
argv[3] ___________/ /
argv[4] ________________/
一个可能的API可以是:
A possible API could be:
char **parseargs(char *arguments, int *argc);
void freeparsedargs(char **argv);
您将需要额外考虑实施freeparsedargs()安全。
You will need additional considerations to implement freeparsedargs() safely.
如果你的字符串很长,你不希望扫描两次,你可以考虑alteranatives喜欢的argv的数组分配更多的元素(和重新分配如果需要的话)。
If your string is very long and you don't want to scan twice you may consider alteranatives like allocating more elements for the argv arrays (and reallocating if needed).
编辑:建议的解决方案(desn't处理报价参数)
Proposed solution (desn't handle quoted argument).
#include <stdio.h>
static int setargs(char *args, char **argv)
{
int count = 0;
while (isspace(*args)) ++args;
while (*args) {
if (argv) argv[count] = args;
while (*args && !isspace(*args)) ++args;
if (argv && *args) *args++ = '\0';
while (isspace(*args)) ++args;
count++;
}
return count;
}
char **parsedargs(char *args, int *argc)
{
char **argv = NULL;
int argn = 0;
if (args && *args
&& (args = strdup(args))
&& (argn = setargs(args,NULL))
&& (argv = malloc((argn+1) * sizeof(char *)))) {
*argv++ = args;
argn = setargs(args,argv);
}
if (args && !argv) free(args);
*argc = argn;
return argv;
}
void freeparsedargs(char **argv)
{
if (argv) {
free(argv[-1]);
free(argv-1);
}
}
int main(int argc, char *argv[])
{
int i;
char **av;
int ac;
char *as = NULL;
if (argc > 1) as = argv[1];
av = parsedargs(as,&ac);
printf("== %d\n",ac);
for (i = 0; i < ac; i++)
printf("[%s]\n",av[i]);
freeparsedargs(av);
exit(0);
}
这篇关于解析串入的argv / argc个的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!