modifié le

Complément sur la fonction main

1. Arguments de la ligne de commande

On récupère les arguments de la ligne de commande via les paramètres de main. Il suffit pour cela de doter main de 2 paramètres : 1 int pour récupérer le nombre d’arguments et 1 tableau/pointeur de chaînes de caractères pour les arguments.

exemple avec indice
int main(int argc, char *argv[])
{
  int i ;

  printf("%d argument(s)\n",argc) ;
  for (i=0 ; i<argc ; i++)
    printf("argv[%d]=%s\n",i,argv[i]) ;

  return 0 ;
}
exemple avec pointeur
int main(int argc, char **argv)
{

  printf("%d argument(s)\n",argc) ;
  while (*++argv) printf("%s ",*argv) ;
  return 0 ;
}

2. getopt

La fonction getopt() analyse les arguments de la ligne de commande. Un argument commence par - est considéré comme une option. getopt() renvoit à chaque appel une nouvelle option. La variable optind est l’indice de l’élément suivant à analyser dans argv. S’il n’y a plus de caractères d’option, getopt() renvoie -1, et optind devient alors l’index du premier élément de argv qui ne soit pas une option (cf man 3 getopt pour plus d’info).

Exemple

L’exemple suivant parse la ligne de commande d’un programme s’utilisant avec 2 options : -n sans valeur associée et -t nécessitant une valeur.

int main(int argc, char *argv[])
{
  int opt;

  while ((opt=getopt(argc, argv, "nt:")) != -1)
  {
    switch (opt)
    {
      case 'n':
          printf("option n présente\n") ;
          break;
      case 't':
          printf("valeur de l'option t: %s\n",optarg) ;
          break;
      default:
          printf("Usage: %s [-t valeur] [-n] name\n",argv[0]);
          return 1 ;
    }
  }
  while (argv[optind]!=NULL)
  {
    printf("argument = %s\n", argv[optind]);
    optind++ ;
  }
  return 0 ;
}

3. getopt_long

La fonction getopt_long permet de récupérer les options (courtes et longues) spécifiées sur la ligne de commande, lors du lancement du programme :

int getopt_long(int argc, char * const argv[],
                  const char *shortopts,
                  const struct option *longopts, int *indexptr);

longopts doit fournir l’adresse d’un tableau contenant un élément par option à gérer, de type :

struct option {
               const char *name;
               int         has_arg;
               int        *flag;
               int         val;
           };
  • name est le nom de l’option à identifier

  • has_arg peut avoir 3 valeurs possibles : no_argument,` required_argument` et optional_argument

  • val doit contenir un entier unique qui servira à identifier l’option traitée

    • si flag vaut NULL, alors val sera retourné par getopt_long quand l’option sera rencontrée

    • si flag ne vaut pas NULL, alors il doit pointer vers une variable : val sera alors stocké dans cette variable lorsque l’option sera rencontrée (et getopt_long renverra 0).

*indexptr retourne l’indice de l’élément de longopts utilisé : par exemple, on peut récupérer le nom de l’option avec longopts[*indexptr].name. Lorsqu’une option a une valeur, celle-ci est stockée dans la variable globale :

char *optarg ;

(si l’option n’a pas de valeur, optarg vaut NULL).

Quand toutes les options ont été extraites, getopt_long renvoie -1, et la variable globale

int optind ;

contient l’indice du prochain élément de argv à traiter.