Comment la variable optind est attribuée en C
-
Utilisez la fonction
getopt
pour analyser les options de ligne de commande en C -
Utilisez les variables
optind
etoptarg
pour traiter les élémentsargv
en C
Cet article démontrera plusieurs méthodes sur la façon dont la variable optind
est affectée en C.
Utilisez la fonction getopt
pour analyser les options de ligne de commande en C
Les programmes de ligne de commande typiques sur les systèmes UNIX acceptent des arguments et des options. Les options sont généralement spécifiées avec des caractères qui suivent les traits d’union, et chaque caractère unique indique des informations sur l’argument donné ou produit le comportement spécifique du programme à exécuter. Les options peuvent avoir des arguments obligatoires ou facultatifs; dans ce dernier cas, il est courant que les programmes autorisent le regroupement des options après un seul trait d’union et le seul argument peut être passé à la fin de la commande.
La fonction getopt
est utilisée pour analyser les options et récupérer les arguments donnés du programme, et exécuter les chemins de code correspondants en fonction de l’entrée. getopt
prend trois arguments, dont les deux premiers sont argc
et argv
passés à la fonction main
. Le troisième argument est optstring
- un pointeur vers une chaîne de caractères représentant les caractères d’option légitimes. getopt
doit être appelé successivement jusqu’à ce que chaque option soit récupérée.
Dans l’exemple suivant, nous montrons un programme qui prend des options avec les caractères p
et x
. Notez que optstring
commence par le deux-points qui indique la valeur qui doit être retournée par l’appel getopt
lorsque les arguments manquants sont rencontrés. De plus, un deux-points spécifié après un caractère (par exemple p
) indique que l’argument est requis pour l’option; deux deux-points signifient que l’argument est facultatif. Le même caractère d’option peut être passé plusieurs fois sur la ligne de commande. La fonction getopt
renvoie le caractère d’option en cas de succès ou renvoie le caractère ?
si le caractère d’option rencontré n’est pas dans optstring
.
#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);
}
Exemple de commande:
./program_name -p hello -p there
Production:
opt = 112 (p); optind = 3
opt = 112 (p); optind = 5
Utilisez les variables optind
et optarg
pour traiter les éléments argv
en C
L’exemple de code précédent montre l’utilisation typique de getopt
, où la fonction est appelée à partir d’une expression de boucle while
jusqu’à ce qu’elle renvoie le code d’erreur -1
. Pendant ce temps, l’instruction switch
vérifie d’éventuelles valeurs de retour getopt
pour exécuter les blocs de code correspondants. Notez que la variable optind
représente l’index de l’élément suivant dans argv
, et qu’elle est initialisée à 1
avant le premier appel à getopt
. Par contre, optarg
est une variable externe qui pointe vers l’argument suivant le caractère d’option courant. Si l’option n’inclut pas d’argument, alors optarg
est mis à zéro. L’exemple de code suivant montre comment sauvegarder l’argument pointé par la variable optarg
et ensuite l’utiliser selon les besoins. Notez que l’argument peut suivre l’option sans séparateur d’espace.
#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);
}
Exemple de commande:
./program_name -p hello
Production:
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