Complément sur la fonction main
1. Arguments de la ligne de commande
On récupère les arguments de la ligne de commande via les paramètres de main
.
Il suffit pour cela de doter main
de 2 paramètres :
1 int
pour récupérer le nombre d’arguments
et 1 tableau/pointeur de chaînes de caractères
pour les arguments.
int main(int argc, char *argv[])
{
int i ;
printf("%d argument(s)\n",argc) ;
for (i=0 ; i<argc ; i++)
printf("argv[%d]=%s\n",i,argv[i]) ;
return 0 ;
}
int main(int argc, char **argv)
{
printf("%d argument(s)\n",argc) ;
while (*++argv) printf("%s ",*argv) ;
return 0 ;
}
2. getopt
La fonction getopt()
analyse les arguments de la ligne de commande.
Un argument commence par -
est considéré comme une option.
getopt()
renvoit à chaque appel une nouvelle option.
La variable optind
est l’indice de l’élément suivant à analyser dans argv
.
S’il n’y a plus de caractères d’option, getopt()
renvoie -1,
et optind
devient alors l’index du premier élément de argv
qui ne soit pas une option
(cf man 3 getopt
pour plus d’info).
L’exemple suivant parse la ligne de commande d’un programme
s’utilisant avec 2 options : -n
sans valeur associée et
-t
nécessitant une valeur.
int main(int argc, char *argv[])
{
int opt;
while ((opt=getopt(argc, argv, "nt:")) != -1)
{
switch (opt)
{
case 'n':
printf("option n présente\n") ;
break;
case 't':
printf("valeur de l'option t: %s\n",optarg) ;
break;
default:
printf("Usage: %s [-t valeur] [-n] name\n",argv[0]);
return 1 ;
}
}
while (argv[optind]!=NULL)
{
printf("argument = %s\n", argv[optind]);
optind++ ;
}
return 0 ;
}
3. getopt_long
La fonction getopt_long
permet de récupérer les options (courtes et longues) spécifiées sur la ligne de commande,
lors du lancement du programme :
int getopt_long(int argc, char * const argv[],
const char *shortopts,
const struct option *longopts, int *indexptr);
longopts
doit fournir l’adresse d’un tableau contenant un élément par option à gérer,
de type :
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
-
name
est le nom de l’option à identifier -
has_arg
peut avoir 3 valeurs possibles :no_argument
,` required_argument` etoptional_argument
-
val
doit contenir un entier unique qui servira à identifier l’option traitée-
si
flag
vautNULL
, alorsval
sera retourné pargetopt_long
quand l’option sera rencontrée -
si
flag
ne vaut pasNULL
, alors il doit pointer vers une variable :val
sera alors stocké dans cette variable lorsque l’option sera rencontrée (etgetopt_long
renverra 0).
-
*indexptr
retourne l’indice de l’élément de longopts
utilisé :
par exemple, on peut récupérer le nom de l’option avec longopts[*indexptr].name
.
Lorsqu’une option a une valeur, celle-ci est stockée dans la variable globale :
char *optarg ;
(si l’option n’a pas de valeur, optarg
vaut NULL
).
Quand toutes les options ont été extraites, getopt_long
renvoie -1
,
et la variable globale
int optind ;
contient l’indice du prochain élément de argv
à traiter.