库解析参数GNU风格? [英] Library for parsing arguments GNU-style?

查看:114
本文介绍了库解析参数GNU风格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我注意到大多数GNU核心应用基本的风格,由此参数是:

I've noticed the basic 'style' of most GNU core applications whereby arguments are:


  • - longoption

  • - longoption =值 - longoption值

  • -abcdefg (多个选项)

  • -iuwww数据(选项 I U = www数据

  • --longoption
  • --longoption=value or --longoption value
  • -abcdefg (multiple options)
  • -iuwww-data (option i, u = www-data)

他们按照上面的风格。我想避免编写参数解析器,如果有,这是否使用上述样式库。有没有一个你知道的?

They follow the above style. I want to avoid writing an argument parser if there's a library that does this using the above style. Is there one you know of?

推荐答案

getopt_long 将做的工作,这里是从<一个例子href=\"http://www.gnu.org/s/libc/manual/html_node/Getopt-Long-Option-Example.html\">http://www.gnu.org/s/libc/manual/html_node/Getopt-Long-Option-Example.html

getopt_long will do the job, here is an example from http://www.gnu.org/s/libc/manual/html_node/Getopt-Long-Option-Example.html

 #include <stdio.h>
 #include <stdlib.h>
 #include <getopt.h>

 /* Flag set by ‘--verbose’. */
 static int verbose_flag;

 int
 main (argc, argv)
      int argc;
      char **argv;
 {
   int c;

   while (1)
     {
       static struct option long_options[] =
         {
           /* These options set a flag. */
           {"verbose", no_argument,       &verbose_flag, 1},
           {"brief",   no_argument,       &verbose_flag, 0},
           /* These options don't set a flag.
              We distinguish them by their indices. */
           {"add",     no_argument,       0, 'a'},
           {"append",  no_argument,       0, 'b'},
           {"delete",  required_argument, 0, 'd'},
           {"create",  required_argument, 0, 'c'},
           {"file",    required_argument, 0, 'f'},
           {0, 0, 0, 0}
         };
       /* getopt_long stores the option index here. */
       int option_index = 0;

       c = getopt_long (argc, argv, "abc:d:f:",
                        long_options, &option_index);

       /* Detect the end of the options. */
       if (c == -1)
         break;

       switch (c)
         {
         case 0:
           /* If this option set a flag, do nothing else now. */
           if (long_options[option_index].flag != 0)
             break;
           printf ("option %s", long_options[option_index].name);
           if (optarg)
             printf (" with arg %s", optarg);
           printf ("\n");
           break;

         case 'a':
           puts ("option -a\n");
           break;

         case 'b':
           puts ("option -b\n");
           break;

         case 'c':
           printf ("option -c with value `%s'\n", optarg);
           break;

         case 'd':
           printf ("option -d with value `%s'\n", optarg);
           break;

         case 'f':
           printf ("option -f with value `%s'\n", optarg);
           break;

         case '?':
           /* getopt_long already printed an error message. */
           break;

         default:
           abort ();
         }
     }

   /* Instead of reporting ‘--verbose’
      and ‘--brief’ as they are encountered,
      we report the final status resulting from them. */
   if (verbose_flag)
     puts ("verbose flag is set");

   /* Print any remaining command line arguments (not options). */
   if (optind < argc)
     {
       printf ("non-option ARGV-elements: ");
       while (optind < argc)
         printf ("%s ", argv[optind++]);
       putchar ('\n');
     }

   exit (0);
 }

这篇关于库解析参数GNU风格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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