2010-05-26 17 views
13

मैं सबसे GNU मूल आवेदनों की बुनियादी 'शैली' ध्यान दिया है जिससे तर्क हैं:जीएनयू-शैली तर्कों को पार्स करने के लिए लाइब्रेरी?

  • --longoption
  • --longoption=value या --longoption value
  • -abcdefg (कई विकल्प)
  • -iuwww-data (विकल्प i, u = www-data)

वे अनुसरण करते हैं उपरोक्त शैली। यदि कोई लाइब्रेरी है जो उपर्युक्त शैली का उपयोग कर रही है तो मैं एक तर्क पार्सर लिखने से बचना चाहता हूं। क्या आप जानते हैं? हालांकि वे वास्तव में argp की सिफारिश

उत्तर

14

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); 
} 
+0

लेकिन यदि आपके पास libc नहीं है ... –

4

जीएनयू, getopt_long प्रदान करता है। जीएनयू libc मैनुअल entry on parsing arguments देखें।

+0

लेकिन यह हिस्सा libc है और एक स्टैंडअलोन लाइब्रेरी नहीं है। –

+0

@Dirk Eddelbuettel प्रश्न स्पष्ट रूप से जीएनयू-शैली का उल्लेख करता है, इसलिए मुझे यकीन नहीं है कि यह एक समस्या है। –

+0

हैंक: ओपी ने शीर्षक में लाइब्रेरी के लिए कहा, यह स्पष्ट नहीं है कि वह libc तक पहुंच सकता है और नहीं चाहता है। यदि लिनक्स पर, वह ठीक है। अगर वह एक पोर्टेबल स्टैंडअलोन लाइब्रेरी चाहता है, तो आपका जवाब मदद नहीं करता है। लेकिन केवल ओपी ही बता सकता है :) –

2

सिर्फ getopt.c और getopt.h उनके स्रोतों के साथ पैक दिन लोगों में वापस एक उदाहरण है।

इसके लिए यहां Google Code query है। यदि आप जीएनयू libc पर निर्भर नहीं करना चाहते हैं तो आप इसका उपयोग कर सकते हैं क्योंकि आपको इसकी आवश्यकता एक अलग ओएस पर हो सकती है। लेकिन अगर आप लिनक्स पर हैं तो libc पहले से ही आपको अन्य उत्तरों के सुझाव के रूप में देता है।

+0

Google Code क्वेरी का लिंक मर चुका है। – gbmhunter

+0

Google कोड एक या दो साल पहले Google द्वारा लिया गया था। –

1

गूगल sourced खुला google-gflags पुस्तकालय, आदेश पंक्ति फ्लैग पार्स पुस्तकालय ..

AFAIK, यह प्रत्येक ध्वज का एक "लंबी और छोटी" संस्करण (ताकि आप एक से अधिक में नहीं जोड़ सकते प्रदान नहीं करता है विकल्प "-एईओयू"), लेकिन इसका उपयोग करने के लिए तुच्छ है और झंडे की केंद्रीकृत सूची की आवश्यकता नहीं है।

संबंधित मुद्दे