Problème de traitement des paramètre avec getopt

Problème de traitement des paramètre avec getopt - C - Programmation

Marsh Posté le 11-05-2006 à 14:47:16    

Bonjour,
 
je n'ai pas trouvé de sujet la dessus (j'ai peut être mal cherché), donc je pose la question.
 
J'essai de faire un traitement des paramètres de la ligne de commande (argc argv), le plus propre possible.
 
Mon problème concerne l'utilisation de la commande getopt ; j'ai lu dans la spécification que la commande renvoie le caractère ':' si une option devant etre  
suivie par un paramètre n'en a pas .
 
Or cela ne marche pas avec mon programme. En effet, si je lui passe "program -c -v", sachant que l'option -c demande un paramètre (-v pour le mode verbose, donc pas de paramètre),
la commande getopt ne renvoi pas ':' et du coup mon programme interpréte "-v" comme le paramètre de l'option "-c".
 
J'ai aussi lu que certaines versions de getopt sont buggée, mais l'explication était floue...
 
Ce problème parle t'il à quelqun ?

Reply

Marsh Posté le 11-05-2006 à 14:47:16   

Reply

Marsh Posté le 11-05-2006 à 16:00:08    

Personne n'a d'idée ?

Reply

Marsh Posté le 11-05-2006 à 18:42:03    

La question serait plus compréhensible si le code était joint.
Pour le cas présent, je coderais cela de la manière suivante :

int main(int argc, char **argv)
{
   extern char *optarg;  
   int o; char verbose_flag, parametre_c[128];
   verbose_flag = 'N';
   parametre_c[0] = '\0';
 
   while((o = getopt(argc, argv, "c:v" )) != EOF) {  
      switch(o) {  
        case 'v': verbose_flag = 'O'; break ;  
        case 'c': strcpy(parametre_c, optarg); break;  
     }  
   }
   ....
}


Message édité par olivthill le 11-05-2006 à 18:50:02
Reply

Marsh Posté le 11-05-2006 à 18:56:58    

julien_54 a écrit :

...j'ai peut être mal cherché...


Peut-être...
 

julien_54 a écrit :

Ce problème parle t'il à quelqun ?


A beaucoup de monde. Mais le mieux est que tu lises toi-même la doc => http://man.developpez.com/man3/getopt.3.php


Message édité par Sve@r le 11-05-2006 à 19:01:17

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-05-2006 à 10:53:22    

J'ai lu la spécification, et j'ai surtout lu ca :
 
"La fonction getopt() renvoie le caractère de l'option s'il en trouve une, `:' s'il manque un paramètre pour une option, `?' s'il y a un caractère inconnu, et EOF (-1) à la fin de la liste des options. "
 
Le problème c'est que ce n'est pas le comportement que j'observe... je voulais juste savoir si c'est un bug connu, où si c'est moi qui l'utilise mal

Code :
  1. int argumentsComputing(int argc,char **argv,char *c_filename,int *verbose)
  2. {
  3. int c=0;
  4.   /* switch on each argument */
  5.   while ((c = getopt(argc, argv, ":c:v" )) != EOF)
  6.   {
  7.     switch (c)
  8.     {
  9.       case 'v':
  10. *verbose=1 ;
  11. break;
  12.       case 'c':
  13. if ((c_filename=(char *)calloc(sizeof(char),strlen(optarg)+1))==NULL)
  14. {
  15.   printf("! Problem when allocating memory ! #Verif-1#\n" );
  16.   return -1;
  17. }
  18. if (strcpy(c_filename,optarg)==NULL)
  19. {
  20.   printf("! Problem when copying string argument ! #Verif-2#\n" );
  21.   return -1;
  22. }
  23. printf("%s\n",c_filename);
  24. break;
  25.       case ':':
  26. printf("! Problem : option -%c requires an operand ! #Verif-3#\n", optopt);
  27. return -1;
  28.       case '?':
  29. printf("! Problem : unrecognized option : -%c ! #Verif-4#\n",optopt);
  30. return -1;
  31.      
  32.     }
  33.   }
  34.   return 0;
  35. }


Message édité par julien_54 le 12-05-2006 à 10:56:20
Reply

Marsh Posté le 12-05-2006 à 11:06:24    

Je crois que le problème se situe sur la ligne

while ((c = getopt(argc, argv, ":c:v" )) != EOF)

Au lieu de ":c:v", il faudrait avoir "c:v".

Reply

Marsh Posté le 12-05-2006 à 11:13:51    

olivthill a écrit :

Je crois que le problème se situe sur la ligne

while ((c = getopt(argc, argv, ":c:v" )) != EOF)

Au lieu de ":c:v", il faudrait avoir "c:v".


 
Oui mais non, man de getopt :  
 


[i]Si le premier caractère de optstring est un deux-points (`:'), alors getopt() renvoie `:' plutôt que `?' pour indiquer un argument d'option manquant.[/i]


 
De toute façon, j'ai essayé avec et sans le ':' ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed