Ist es möglich, eine getopt_long Argumentliste rückwärts zu durchlaufen?
-
16-09-2020 - |
Frage
Ich möchte an eine von mehreren möglichen Argumentlisten delegieren, je nachdem, ob bestimmte Argumente vorliegen, nach dem Vorbild von:
./test --do-thing-1 --option-A=7 --common-option --option-B=2 # options C and D not valid
./test --do-thing-2 --option-C=9 --common-option --option-D=1 # options A and B not valid
Und der beste Weg, den ich mir vorstellen kann, um das ordentlich zu machen, ist zu haben main()
verarbeiten Sie alle gängigen Optionen und entscheiden Sie, welche von mehreren Funktionen aufgerufen werden soll, um den Rest zu verarbeiten.
Beachten Sie, dass ich die Reihenfolge nicht einschränken möchte, damit allgemeine Optionen nur zuerst auftreten können.
Mein Problem ist, dass wenn ich zurücksetze optind
auf 1, bevor die Argumente ein zweites Mal analysiert werden, getopt_long
segfaults durch Übergabe einer ungültigen Zeichenfolge an strncmp
- also denke ich, ich sollte mich nicht mit Optind anlegen.
Ich hatte ein Google und kann keinen Hinweis darauf finden, ob es möglich ist, um das herumzuspringen getopt_long
argumentliste (ich weiß, dass es möglich ist für getopt
), wenn ja, wie mache ich das?
Ich würde es vorziehen, keine nicht standardmäßigen Bibliotheken zu verwenden.(Sprache ist einfaches c, bitte kein c ++)
Lösung
Mein Problem war, dass ich die letzte Zeile meines nicht eingestellt hatte static struct option long_options[]
array auf Nullen, wenn Sie dies richtig einstellen, wird der Fehler behoben.
GNU getopt erfordert auch optind
auf 0 und nicht auf 1 zurückgesetzt werden, um den internen Zustand korrekt zurückzusetzen.