Gérer les arguments à l'aide de getopt en C++

Muhammad Husnain 12 octobre 2023
Gérer les arguments à l'aide de getopt en C++

Cet article montre comment utiliser la fonction getopt() pour traiter les arguments passés dans la ligne de commande au code. Le didacticiel explique également comment le code peut être manipulé pour effectuer certaines actions avec une entrée spécifique.

Gérer les arguments à l’aide de la fonction getopt() en C++

Supposons que nous ayons le code ci-dessous.

// File titled arg_test.cpp
#include <stdio.h>
#include <unistd.h>

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

  while ((opt = getopt(argc, argv, ":f:asd")) != -1) {
    if (opt == 'a' || opt == 's' || opt == 'd') {
      printf("Option Selected is: %c\n", opt);
    } else if (opt == 'f') {
      printf("Filename entered is: %s\n", optarg);
    } else if (opt == ':') {
      printf("Option requires a value \n");
    } else if (opt == '?') {
      printf("Unknown option: %c\n", optopt);
    }
  }

  // optind is for the extra arguments that are not parsed by the program
  for (; optind < argc; optind++) {
    printf("Extra arguments, not parsed: %s\n", argv[optind]);
  }

  return 0;
}

La syntaxe de la fonction getopt() est la suivante :

getopt(int argc, char *const argv[], const char *optstring)

argc est un entier et argv est un tableau de caractères. Le optstring est une liste de caractères, chacun représentant une option d’un seul caractère.

La fonction renvoie -1 lorsqu’elle a fini de traiter tout ce qui se trouve dans l’entrée.

La fonction getopt() renvoie ? lorsqu’il rencontre quelque chose qu’il ne reconnaît pas. De plus, cette option non reconnue est stockée dans la variable externe optopt.

Par défaut, si l’option nécessite une valeur, par exemple, dans notre cas, l’option f nécessite une valeur d’entrée, donc getopt() renverra ?. Cependant, en plaçant les deux-points (:) comme premier caractère de optstring, la fonction renvoie : au lieu de ?.

Dans notre cas, la saisie d’une entrée de a, s ou d devrait renvoyer l’option elle-même, l’utilisation de f devrait renvoyer le nom de fichier fourni en tant qu’argument, et tout le reste ne devrait pas être considéré comme une option valide.

Pour exécuter le code ci-dessus, vous pouvez utiliser une commande similaire dans votre terminal :

gcc arg_test.cpp && ./a.out

Bien sûr, le simple fait d’entrer ceci ne vous donnera aucune sortie utile. Nous entrerons dans un exemple de cas d’utilisation et un exemple de sortie et expliquerons comment chaque commande est traitée.

Si nous entrons la commande suivante à titre d’exemple :

gcc arg_test.cpp && ./a.out -f filename.txt -i -y -a -d testingstring not_an_option

Nous obtiendrons ce qui suit en sortie :

Filename entered is: filename.txt
Unknown option: i
Unknown option: y
Option Selected is: a
Option Selected is: d
Extra arguments, not parsed: testingstring
Extra arguments, not parsed: not_an_option

Les options a et d ont été renvoyées comme prévu. Le nom de fichier donné après le drapeau f est également signalé, et les options i et y sont passées dans le ? catégorie et ont été reconnus comme des commandes inconnues.

Ici, nous pouvons voir qu’en plus des scénarios décrits ci-dessus, la dernière boucle que nous avons ajoutée après la fonction getopt() traite les arguments restants qui n’ont pas été traités par la fonction (testingstring et not_an_option, dans notre Cas).

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Article connexe - C++ Function