2016-04-08 11 views
1

Ich bin tatsächlich in Schwierigkeiten, würde Ich mag, wie sie ein mehr Argumente Zeile analysieren:Parsing Multiple Argument Linie

./a.out -a 0 L 
./a.out -ab 
./a.out -abc 

Ich versuchte es mit getopt zu haben, aber ich war nicht erfolgreich. Tatsache ist, dass ich das mehr Argument nicht umgehen kann wie

./a.out -abc 
./a.out -edg 

Gibt es eine Möglichkeit, ihm die Art und Weise zu tun, ich mit einer Funktion wie getopt will?

Oder sollte ich tun (mit getopt):

./a.out -a -b 
./a.out -a -b -c 
+1

Welches Problem haben Sie beim Versuch, getopt zu verwenden? – danielfranca

+0

Das Problem ist das: "./a.out -a 0 J" ist die erste Option meines Programms, die zwei Argumente zu nehmen. "./a.out -abc" Ist eine andere Option, die nichts anderes als die Parameter nach dem '-' übernimmt. Mein Problem ist also, dass ich beide nicht zum Parsen meiner Kommandozeile kombinieren kann. – Exho

+0

Warum brauchen Sie 2 Parameter? Warum verwenden Sie keine andere Syntax? dh: "./a -a 0, J -abc" – danielfranca

Antwort

1

"a ::" -a mit optionalen Argumenten macht. -a setzt das Flag options, um zwei separate Argumente zu erhalten. -aopt mit beigefügten Optionen akzeptiert opt

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char *argv[]) 
{ 
    int c = 0; 
    int each = 0; 
    int options = 0; 

    if (!(argc == 2 || argc == 4)) { 
     fprintf(stderr, "Usage:\t%s -aopt\n or\n\t%s -a opt1 opt2\n", argv[0], argv[0]); 
     return 1; 
    } 
    while((c = getopt(argc, argv, "a::")) != -1) { 

     switch(c) { 
      case 'a': 
       if (optarg) {// -aopt 
        printf ("%s\n", optarg); 
       } 
       else { 
        options = 1;// -a by itself 
       } 
       break; 
      default: 
       fprintf(stderr, "Usage:\t%s -aopt\n or\n\t%s -a opt1 opt2\n", argv[0], argv[0]); 
       return 1; 
     } 
    } 
    if (optind + 2 == argc) { 
     if (options) { 
      for (each = optind; each < argc; each++) { 
       if ((argv[each][0] != '-')) { 
        printf ("found argument %s\n", argv[each]); 
       } 
      } 
     } 
     else { 
      fprintf(stderr, "Usage:\t%s -aopt\n or\n\t%s -a opt1 opt2\n", argv[0], argv[0]); 
      return 1; 
     } 
    } 

    return 0; 
} 
+0

Das war genau das, was ich gesucht habe, vielen Dank !! – Exho