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;
}
Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top