Библиотека для парсинга стиля GNU аргументов? [закрытый]

13
задан Delan Azabani 26 May 2010 в 14:18
поделиться

5 ответов

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);
 }
14
ответ дан 1 December 2019 в 21:51
поделиться

Раньше люди просто упаковывали getopt.c и getopt.h со своими исходными кодами.

Вот запрос Google Code для этого. Вы можете использовать это, если не хотите зависеть от GNU libc, потому что вам это может понадобиться в другой ОС. Но если вы используете Linux, то libc уже дает его вам, как предлагали другие ответы.

2
ответ дан 1 December 2019 в 21:51
поделиться

GNU предоставляет getopt_long , хотя на самом деле они рекомендуют argp . Посмотрите статью GNU libc manual о синтаксическом анализе аргументов .

4
ответ дан 1 December 2019 в 21:51
поделиться

Google открыл исходный код библиотеки google-gflags , библиотеки синтаксического анализа флагов командной строки.

AFAIK, он не предоставляет "длинную и короткую" версию каждого флага (так что вы не может сочетаться в нескольких параметрах «-aeiou»), но его легко использовать и не требуется централизованный список флагов.

1
ответ дан 1 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: