Le comportement de getopt () est inhabituel
Question
getopt ()
ne se comporte pas comme prévu pour les options abrégées.
Exemple: appel du programme ci-dessous avec un paramètre manquant:
Cas valide: testopt -d dir -a action -b build
Cas d'erreur: testopt -d -a action -b build
Cela n'a généré aucune erreur car je m'attendais à un opérande de message d'erreur manquant pour -d
- Est-ce un bug connu?
- Si tel est le cas, existe-t-il un correctif standard disponible?
Mon code:
#include <unistd.h>
/* testopt.c */
/* Test program for testing getopt */
int main(int argc, char **argv)
{
int chr;
while ( ( chr = getopt(argc, argv, ":d:a:b:") ) != -1 )
{
switch(chr)
{
case 'a':
printf("Got a...\n");
break;
case 'b':
printf("Got b...\n");
break;
case 'd':
printf("Got d...\n");
break;
case ':':
printf("Missing operand for %c\n", optopt);
break;
case '?':
printf("Unknown option %c\n", optopt);
break;
}
}
printf("execution over\n");
return 0;
}
La solution
getopt ()
pense que -a
est un argument pour -d
, pas une option.
Essayez testopt -a action -b build -d
- il devrait se plaindre de l'argument manquant.
Vous devez vérifier pour l'option -d
(et toutes les autres options) que optarg
a une valeur valide - celle sans tiret au début.
Autres conseils
Selon la page de manuel , vous devriez commencer votre chaîne d’option par deux points afin de faire en sorte que getopt ()
renvoie ':'
pour indiquer l’argument manquant. La valeur par défaut semble renvoyer '?'
.
Le code ci-dessus fonctionne correctement pour moi, avec gcc 3.4.5 sur Red Hat:
$ ./a.out -d test
Got d...
execution over
$ ./a.out -d
Missing operand for d
execution over
Quel est votre environnement?
MISE À JOUR : OK, qrdl est sur place. Comment se fait-il que getopt () fonctionne de cette façon?