Wie optind Variable in C zugewiesen wird
-
Verwenden Sie die Funktion
getopt
, um Befehlszeilenoptionen in C zu analysieren -
Verwenden Sie die Variablen
optind
undoptarg
, um die Elementeargv
in C zu verarbeiten
Dieser Artikel zeigt verschiedene Methoden, wie die Variable optind
in C zugewiesen wird.
Verwenden Sie die Funktion getopt
, um Befehlszeilenoptionen in C zu analysieren
Typische Befehlszeilenprogramme auf UNIX-basierten Systemen verwenden Argumente und Optionen. Optionen werden normalerweise mit Zeichen angegeben, die auf Bindestriche folgen, und jedes eindeutige Zeichen gibt entweder Informationen zu dem angegebenen Argument an oder liefert das spezifische Verhalten des auszuführenden Programms. Optionen können obligatorische oder optionale Argumente haben. Im letzteren Fall ist es für Programme üblich, die Gruppierung der Optionen nach einem einzelnen Bindestrich zuzulassen, und das einzige Argument kann am Ende des Befehls übergeben werden.
Die Funktion getopt
wird verwendet, um die Optionen zu analysieren, gegebene Argumente aus dem Programm abzurufen und die entsprechenden Codepfade basierend auf der Eingabe auszuführen. getopt
verwendet drei Argumente, von denen die ersten beiden argc
und argv
sind, die an die Funktion main
übergeben werden. Das dritte Argument ist optstring
- ein Zeiger auf eine Zeichenkette, die die legitimen Optionszeichen darstellt. getopt
muss nacheinander aufgerufen werden, bis alle Optionen abgerufen wurden.
Im folgenden Beispiel zeigen wir ein Programm, das Optionen mit den Zeichen p
und x
verwendet. Beachten Sie, dass optstring
mit dem Doppelpunkt beginnt, der den Wert angibt, der vom Aufruf getopt
zurückgegeben werden muss, wenn die fehlenden Argumente auftreten. Ein nach einem Zeichen angegebener Doppelpunkt (z. B. p
) gibt außerdem an, dass das Argument für die Option erforderlich ist. Zwei Doppelpunkte bedeuten, dass das Argument optional ist. Das gleiche Optionszeichen kann in der Befehlszeile mehrmals übergeben werden. Die Funktion getopt
gibt bei Erfolg das Optionszeichen zurück oder gibt das Zeichen ?
Zurück. wenn sich das angetroffene Optionszeichen nicht in optstring
befindet.
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt, xnum = 0;
char *pstr = NULL;
while ((opt = getopt(argc, argv, ":p:x")) != -1) {
printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);
switch (opt) {
case 'p':
pstr = optarg;
break;
case 'x':
xnum++;
break;
case ':':
fprintf(stderr,
"Missing argument!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
case '?':
fprintf(stderr,
"Unrecognized option!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
default:
fprintf(stderr, "Unexpected case in switch()");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
Beispielbefehl:
./program_name -p hello -p there
Ausgabe:
opt = 112 (p); optind = 3
opt = 112 (p); optind = 5
Verwenden Sie die Variablen optind
und optarg
, um die Elemente argv
in C zu verarbeiten
Das vorherige Codebeispiel zeigt die typische Verwendung von getopt
, bei der die Funktion von einem Ausdruck der while-Schleife aufgerufen wird, bis der Fehlercode -1
zurückgegeben wird. In der Zwischenzeit sucht die Anweisung switch
nach möglichen getopt
-Rückgabewerten, um die entsprechenden Codeblöcke auszuführen. Beachten Sie, dass die Variable optind
den Index des nächsten Elements im argv
darstellt und vor dem ersten Aufruf von getopt
auf 1
initialisiert wird. Andererseits ist optarg
eine externe Variable, die auf das Argument verweist, das auf das aktuelle Optionszeichen folgt. Wenn die Option kein Argument enthält, wird optarg
auf Null gesetzt. Das nächste Codebeispiel zeigt, wie Sie das Argument speichern, auf das die Variable optarg
zeigt, und es dann nach Bedarf bearbeiten. Beachten Sie, dass das Argument der Option ohne Leerzeichen folgen kann.
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt, xnum = 0;
char *pstr = NULL;
while ((opt = getopt(argc, argv, ":p:x")) != -1) {
printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);
switch (opt) {
case 'p':
pstr = optarg;
break;
case 'x':
xnum++;
break;
case ':':
fprintf(stderr,
"Missing argument!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
case '?':
fprintf(stderr,
"Unrecognized option!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
default:
fprintf(stderr, "Unexpected case in switch()");
exit(EXIT_FAILURE);
}
}
if (xnum != 0) printf("-x was specified (count=%d)\n", xnum);
if (pstr != NULL) printf("-p was specified with the value \"%s\"\n", pstr);
if (optind < argc)
printf("First non-option argument is \"%s\" at argv[%d]\n", argv[optind],
optind);
exit(EXIT_SUCCESS);
}
Beispielbefehl:
./program_name -p hello
Ausgabe:
opt = 112 (p); optind = 3
-p was specified with the value "hello"
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook