解析串入的argv / argc个 [英] Parse string into argv/argc

查看:221
本文介绍了解析串入的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆