当前位置: 首页 > 面试题库 >

库用于解析GNU风格的参数?

卫才
2023-03-14
问题内容

我注意到大多数GNU核心应用程序的基本“样式”,其中参数为:

  • --longoption
  • --longoption=value 要么 --longoption value
  • -abcdefg (多种选择)
  • -iuwww-data(选项iu = www-data

他们遵循上述样式。我想避免编写参数解析器,如果有一个使用上述样式的库可以做到这一点。你知道吗?


问题答案:

getopt_long将完成这项工作,这是来自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);
 }


 类似资料:
  • 本文向大家介绍PHP中通过getopt解析GNU C风格命令行选项,包括了PHP中通过getopt解析GNU C风格命令行选项的使用技巧和注意事项,需要的朋友参考一下 在 PHP 中,当我们在获取命令行参数时,可以通过遍历$argv来获取,其实呢是有规范可循的,也就是 GNU C-style parser for command line options 。 比如使用命令wget下载文件时,使用下

  • 假设我需要解析一个JSON(见下文)。 首先,我解析“status”字段,以获得的实例(见下文) 我可以用解析JSON以获得而不首先获得吗?

  •  TJS2在行文风格上和C一类的语言类似。和通过换行结束一个语句的BASIC等语言不同,格式基本上为“自由风格”。  但是,不能像JavaScript一样以换行符结束一个语句。 自由风格  换行符、空格和制表符(Tab)等,一般称为“空白字符”,只要不改变句子意思,可以在任何地方插入空白字符,而且,为正确表达语句,必须适当地插入。 例: (1) functionfunc(a,b){a++;retu

  • 这个问题可能已经从所有其他类似的问题中得到了含蓄的回答,但我似乎无法让它起作用。 如果我试图从主源集中的Kotlin文件引用相同的文件,它会抱怨看不到它(“未解析的引用”)。 如果我将相同的文件移动到主源集,它就可以工作了(所以它不是文件本身)。 如果我将Java文件转换为Kotlin,它可以工作(这是我目前的解决方案),但我想知道为什么它不能工作,因为转换并不总是那么容易,它应该可以不进行转换。

  • camelCase 很糟 你曾维护过别人的代码吗?你维护过像这样的代码吗? my $variableThatContainsData = someSubroutineThatMucksWithData( $someAwfulVariable ); 混合大小写单词在 Perl 世界被称为 camelCase,通常它的令人不悦之处是使 阅读代码更难。 甚至具有糟糕名称的代码使用下划线也能变得

  • 本文向大家介绍详解Spring框架之基于Restful风格实现的SpringMVC,包括了详解Spring框架之基于Restful风格实现的SpringMVC的使用技巧和注意事项,需要的朋友参考一下 如果说现在你要做一个系统,假设说有一个模块属于公告管理,那么我们可能安排路径的时候会这样安排NewsAction路径:  增加新闻:/pages/back/admin/news/add.action;