2008-11-05 7 views
2

getopt() ne se comporte pas comme je m'attends à des options courtes.comportement getopt() est inhabituel

par exemple: Invoquer le programme ci-dessous avec un paramètre manquant:

Case valide: testopt -d dir -a action -b build

Erreur de cas: testopt -d -a action -b build

Cela ne jette aucune erreur que je me attendais à un opérande de message d'erreur manquant pour -d

  • Est-ce un bug connu?
  • Si oui, 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; 
} 

Répondre

4

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.

+0

L'invocation n'est pas sous le contrôle du programme et donc je pense que vérifier si le premier caractère est "-" est une solution comme vous l'avez dit. –

0

Selon the manual page, vous devriez commencer votre chaîne d'option avec deux points afin de faire getopt() retour ':' pour indiquer argument manquant. La valeur par défaut semble être '?'.

+0

J'ai modifié avec cette option mais il se comporte de la même manière. –

0

Le code ci-dessus fonctionne bien pour moi, en utilisant 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?

Questions connexes