c - simple - Befehlszeilenoptionen mit mehreren Argumenten analysieren




parse command line arguments (2)

Ihr Code war tatsächlich sehr, sehr nahe am Arbeiten. Das einzige, was Ihnen fehlte, ist, dass getopt nur erwartet, dass Sie ein Argument nach -l konsumieren, und deshalb die Analyse der Befehlszeile nach dem ersten Argument nach -l . Da Sie hinter den Rücken gehen und weitere Argumente ziehen, müssen Sie getopt sagen, wo Sie die Befehlszeile erneut parsen sollen.

getopt speichert diese Informationen in der globalen Variable optind . Als ich die Zeile hinzugefügt habe:

optind = index - 1;

vor der break; In Ihrem Fall hat Ihr Code angefangen zu arbeiten.

Ich brauche mein Programm, um mehrere Argumente von der Befehlszeile zu bekommen, die Syntax ist wie folgt:

getpwd -l user1 user2 ... -L -X -S...

Also muss ich die Benutzer hinter die Option -l . Ich habe versucht, getopt , aber ohne viel Glück funktioniert es nur, wenn ich die anderen Optionen vor dem -l :

getpwd -L -X -S ... -l user1 user2 ...

Mein Code (für -l und -S ):

    while((c = getopt(argc, argv, "l:S")) != -1){
    switch(c){
        case 'l':
            index = optind-1;
            while(index < argc){
                next = strdup(argv[index]); /* get login */
                index++;
                if(next[0] != '-'){         /* check if optarg is next switch */
                    login[lcount++] = next;
                }
                else break;
            }
            break;
        case 'S':
            sflag++;                        /* other option */
            break;
        case ':':                           /* error - missing operand */
            fprintf(stderr, "Option -%c requires an operand\n", optopt);
            break;
        case '?':                           /* error - unknown option */
            fprintf(stderr,"Unrecognized option: -%c\n", optopt);
            break;
      }
   }

optopt und optind sind extern int .

Die Frage ist also: Kann ich die Funktion getopt() (oder getopt_long() ) verwenden? Oder muss ich meinen eigenen Parser schreiben, um zu bekommen, was ich brauche?


Ich habe eine C-Bibliothek geschrieben (GPL-Lizenz) zum Parsen von Befehlszeilenargumenten:

https://github.com/Vincenzo1968/myoptParser

https://github.com/Vincenzo1968/myoptParser/blob/master/how_to_use.md

Sie können die minimale und die maximale Anzahl der Argumente angeben, die diese Option akzeptiert. Sie können auch angeben, dass eine Option null oder mehr Argumente (oder ein oder mehrere, zwei oder mehr usw.) benötigt. Und natürlich können Sie eine feste Anzahl von Argumenten angeben: null, eins, zwei und so weiter.

Sie können auch den Typ der Argumente angeben: string, integer oder float. Der Parser überprüft, ob die angegebene Anzahl und der angegebene Typ übereinstimmen, andernfalls wird ein Fehler zurückgegeben.

Mit dem Parser können Sie außerdem angeben, ob eine Option erforderlich ist oder nicht. Sie können schließlich die sich gegenseitig ausschließenden Optionen angeben.





command-line-arguments