将字符串解析为 argv/argc [英] Parse string into argv/argc

查看:45
本文介绍了将字符串解析为 argv/argc的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 C 中有没有办法解析一段文本并获取 argv 和 argc 的值,就好像文本已通过命令行传递给应用程序一样?

Is there a way in C 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.

推荐答案

如果 glib 解决方案对您的情况来说太过分了,您可以考虑自己编写一个.

If glib solution is overkill for your case you may consider coding one yourself.

然后你可以:

  • 扫描字符串并计算有多少个参数(然后你得到你的 argc)
  • 分配一个 char * 数组(为您的 argv)
  • 重新扫描字符串,在分配的数组中分配指针并用'\0'替换空格(如果你不能修改包含参数的字符串,你应该复制它).
  • 别忘了释放你分配的东西!

下图应该澄清(希望如此):

The diagram below should clarify (hopefully):

             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.

如果您的字符串很长并且您不想扫描两次,您可以考虑替代方案,例如为 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).

建议的解决方案(不处理引用的参数).

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天全站免登陆