Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

5年前关闭。



Improve this question




我注意到大多数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);
     }
    

    09-25 17:42