Comment la variable optind est attribuée en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction getopt pour analyser les options de ligne de commande en C
  2. Utilisez les variables optind et optarg pour traiter les éléments argv en C
Comment la variable optind est attribuée en C

Cet article démontrera plusieurs méthodes sur la façon dont la variable optind est affectée en C.

Utilisez la fonction getopt pour analyser les options de ligne de commande en C

Les programmes de ligne de commande typiques sur les systèmes UNIX acceptent des arguments et des options. Les options sont généralement spécifiées avec des caractères qui suivent les traits d’union, et chaque caractère unique indique des informations sur l’argument donné ou produit le comportement spécifique du programme à exécuter. Les options peuvent avoir des arguments obligatoires ou facultatifs; dans ce dernier cas, il est courant que les programmes autorisent le regroupement des options après un seul trait d’union et le seul argument peut être passé à la fin de la commande.

La fonction getopt est utilisée pour analyser les options et récupérer les arguments donnés du programme, et exécuter les chemins de code correspondants en fonction de l’entrée. getopt prend trois arguments, dont les deux premiers sont argc et argv passés à la fonction main. Le troisième argument est optstring - un pointeur vers une chaîne de caractères représentant les caractères d’option légitimes. getopt doit être appelé successivement jusqu’à ce que chaque option soit récupérée.

Dans l’exemple suivant, nous montrons un programme qui prend des options avec les caractères p et x. Notez que optstring commence par le deux-points qui indique la valeur qui doit être retournée par l’appel getopt lorsque les arguments manquants sont rencontrés. De plus, un deux-points spécifié après un caractère (par exemple p) indique que l’argument est requis pour l’option; deux deux-points signifient que l’argument est facultatif. Le même caractère d’option peut être passé plusieurs fois sur la ligne de commande. La fonction getopt renvoie le caractère d’option en cas de succès ou renvoie le caractère ? si le caractère d’option rencontré n’est pas dans optstring.

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  int opt, xnum = 0;
  char *pstr = NULL;

  while ((opt = getopt(argc, argv, ":p:x")) != -1) {
    printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);

    switch (opt) {
      case 'p':
        pstr = optarg;
        break;
      case 'x':
        xnum++;
        break;
      case ':':
        fprintf(stderr,
                "Missing argument!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      case '?':
        fprintf(stderr,
                "Unrecognized option!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      default:
        fprintf(stderr, "Unexpected case in switch()");
        exit(EXIT_FAILURE);
    }
  }

  exit(EXIT_SUCCESS);
}

Exemple de commande:

./program_name -p hello -p there

Production:

opt = 112 (p); optind = 3
opt = 112 (p); optind = 5

Utilisez les variables optind et optarg pour traiter les éléments argv en C

L’exemple de code précédent montre l’utilisation typique de getopt, où la fonction est appelée à partir d’une expression de boucle while jusqu’à ce qu’elle renvoie le code d’erreur -1. Pendant ce temps, l’instruction switch vérifie d’éventuelles valeurs de retour getopt pour exécuter les blocs de code correspondants. Notez que la variable optind représente l’index de l’élément suivant dans argv, et qu’elle est initialisée à 1 avant le premier appel à getopt. Par contre, optarg est une variable externe qui pointe vers l’argument suivant le caractère d’option courant. Si l’option n’inclut pas d’argument, alors optarg est mis à zéro. L’exemple de code suivant montre comment sauvegarder l’argument pointé par la variable optarg et ensuite l’utiliser selon les besoins. Notez que l’argument peut suivre l’option sans séparateur d’espace.

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  int opt, xnum = 0;
  char *pstr = NULL;

  while ((opt = getopt(argc, argv, ":p:x")) != -1) {
    printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);

    switch (opt) {
      case 'p':
        pstr = optarg;
        break;
      case 'x':
        xnum++;
        break;
      case ':':
        fprintf(stderr,
                "Missing argument!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      case '?':
        fprintf(stderr,
                "Unrecognized option!\n"
                "Usage: %s [-p arg] [-x]\n",
                argv[0]);
        exit(EXIT_FAILURE);
      default:
        fprintf(stderr, "Unexpected case in switch()");
        exit(EXIT_FAILURE);
    }
  }

  if (xnum != 0) printf("-x was specified (count=%d)\n", xnum);
  if (pstr != NULL) printf("-p was specified with the value \"%s\"\n", pstr);
  if (optind < argc)
    printf("First non-option argument is \"%s\" at argv[%d]\n", argv[optind],
           optind);

  exit(EXIT_SUCCESS);
}

Exemple de commande:

./program_name -p hello

Production:

opt = 112 (p); optind = 3
-p was specified with the value "hello"
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook