Arguments en C

Arguments en C - C - Programmation

Marsh Posté le 16-10-2009 à 23:09:47    

Salut,
 
Ca fait une plombe que j'ai pas touché au C AINSI sous linux. J'ai qq questions concernant la gestion de args/params en ligne de commande :)
J'ai un prog qui accepte au max 4 arguments, mais seulement un est obligatoire, les autres étant optionnel. Chaque argument à une "value" cad :
 

Code :
  1. // minimum :
  2. ./monProg -a 2
  3. // maximum :
  4. ./monProg -a 2 -b 4 -c 3 -d 5


 
Pour récupérer mon "-a" c'est argv[1], pour récupérer le "2" c'est argv[2] etc.
Pour checker si j'ai mon "a" je fais un

Code :
  1. if( strcmp(argv[1],"-a" )==0 ) // j'ai bien mon "-a"


Ensuite, pour checker si l'utilisateur à bien rentrer un chiffre (2 ici) juste après le "a", que dois-je faire ? Car si je fais un :

Code :
  1. if( int nb = atoi(argv[2]) );

Sauf que si argv[2] (le "2" ici) n'a pas été rentré par l'utilisateur, ca me jète un segfault car argv[2] n'existe pas.. Comment dans ce cas tester l'existence (ou non) d'un argument ? (Une sorte de isset() comme en php..)
 
Existe-t-il une manière "propre" pour gérer des arguments ? switch/case ? if/else ? autre ?
 
Merci bcp.

Reply

Marsh Posté le 16-10-2009 à 23:09:47   

Reply

Marsh Posté le 17-10-2009 à 02:49:28    

En comptant préalablement les arguments avec argc ?
 
Sinon, je suis loin d'être un spécialiste en C, mais je suis sûr qu'il existe tout plein de librairies qui font ce genre de boulot correctement.

Reply

Marsh Posté le 17-10-2009 à 02:58:44    

tabb a écrit :

switch/case ? if/else ? autre ?


 
Oui, getopt, et oublie tout le reste (de mémoire, non testé) :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <getopt.h>
  4. int main(int nb, char * argv[])
  5. {
  6.     int ch;
  7.     while ((ch = getopt(nb, argv, "a:b:c:d:" )) > 0)
  8.     {
  9.          switch (ch) {
  10.          case 'a':
  11.          case 'b':
  12.          case 'c':
  13.          case 'd':
  14.              fprintf(stderr, "option '%c', value = %s\n", ch, optarg);
  15.              break;
  16.          case ':':
  17.              fprintf(stderr, "option '%c', missing value\n", optopt);
  18.              break;
  19.          case '?':
  20.              fprintf(stderr, "invalid switch -%c\n", optopt);
  21.          }
  22.     }
  23.     while (optind < nb)
  24.     {
  25.          fprintf(stderr, "remaining option %s\n", argv[optind]);
  26.          optind ++;
  27.     }
  28. }


Message édité par tpierron le 17-10-2009 à 02:59:27
Reply

Marsh Posté le 17-10-2009 à 15:59:53    

ccp6128 a écrit :

En comptant préalablement les arguments avec argc ?


Ouais mais l'utilisateur peut rentrer par exemple : ./prog -t -a
Dans ce cas là j'ai bien 2 arguments mais pas les bons!
 

Citation :

Oui, getopt, et oublie tout le reste (de mémoire, non testé) :


Ok je vais tester ca.

Reply

Marsh Posté le 18-10-2009 à 01:08:44    

Bah tu peux parcourir chaque tableau correspondant a un argument pour vérifier ce qu'il y a a l'intérieur
 
un truc du genre
 

Code :
  1. int            is_number(char *str)
  2. {
  3. int           i;
  4. int           boolean;
  5. i = 0;
  6. boolean = 1;
  7. while (str[i] != '\0'  && boolean == 1)
  8.   {
  9.     boolean = 0;
  10.     if (str[i] >= '0' && str[i] <= '9')
  11.       boolean = 1;
  12.     i++;
  13.   }
  14. return (boolean);
  15. }


 
ca renvoie 1 si le string contient uniquement des chiffres, et 0 si il contient autre chose.


Message édité par malka1986 le 18-10-2009 à 01:23:40
Reply

Marsh Posté le 18-10-2009 à 09:52:05    

non, definitivement getopt

Reply

Marsh Posté le 22-10-2009 à 18:41:26    

Merci bien.
 
Une autre question, j'aimerai savoir comme récupérer des arguments grâce au pipe comme cela :
 

Code :
  1. $ cat data.txt
  2. t=1
  3. s=2
  4. e=3
  5. $ cat data.txt | monprog.exe
  6. $ // ne fonctionne pas


 
J'aimerai donc que les arguments contenu dans data.txt viennent en paramètre de mon programme..  
Y a t-il une façon de la faire ?
 
Merci.

Reply

Marsh Posté le 22-10-2009 à 18:42:24    

il faut lire stdin dans ton programme.

Reply

Marsh Posté le 22-10-2009 à 18:54:50    

Code :
  1. cat data.txt | xargs monprog.exe


 
Voir man xargs pour plus d'informations.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Sujets relatifs:

Leave a Replay

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