argc et argv en C

Jinku Hu 12 octobre 2023
  1. Utilisez la notation int argc, char *argv[] pour obtenir des arguments de ligne de commande en C
  2. Utilisez memccpy pour concaténer les arguments de la ligne de commande en C
argc et argv en C

Cet article explique plusieurs méthodes d’utilisation des arguments de la ligne de commande, argc et argv, en C.

Utilisez la notation int argc, char *argv[] pour obtenir des arguments de ligne de commande en C

Lorsqu’un programme est exécuté, l’utilisateur peut spécifier les chaînes de caractères séparées par des espaces, appelées arguments de la ligne de commande. Ces arguments sont disponibles dans la fonction main du programme et peuvent être analysés comme des chaînes individuelles à terminaison nulle. Pour accéder aux arguments, nous devons inclure des paramètres comme int argc, char *argv[], représentant le nombre d’arguments passés et le tableau de chaînes contenant les arguments de la ligne de commande. La première chaîne du tableau est le nom du programme lui-même selon la convention ; ainsi, le nombre d’arguments argc inclut le nom du programme. Nous pouvons imprimer chaque argument de la ligne de commande avec une simple itération à travers le tableau argv, comme le montre l’exemple suivant.

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

int main(int argc, char *argv[]) {
  for (int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);

  exit(EXIT_SUCCESS);
}

Exemple de commande :

./program hello there

Production :

argv[0] = ./program
argv[1] = hello
argv[2] = there

Le tableau argv de chaînes de caractères à terminaison nulle est terminé par un pointeur NULL pour indiquer le dernier argument. Ainsi, nous pouvons utiliser cette fonctionnalité pour implémenter la boucle d’impression des arguments en évaluant le pointeur argv lui-même et en l’incrémentant jusqu’à ce qu’il soit égal à NULL. Notez qu’il est préférable de faire un pointeur char* séparé pour la boucle afin de préserver l’adresse originale du tableau au cas où il serait nécessaire plus tard dans le programme. L’exemple de code suivant suppose que la même commande est exécutée comme dans l’exemple précédent.

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

int main(int argc, char *argv[]) {
  char **ptr;
  for (ptr = argv; *ptr != NULL; ptr++) printf("%s\n", *ptr);

  exit(EXIT_SUCCESS);
}

Production :

./program
hello
there

Utilisez memccpy pour concaténer les arguments de la ligne de commande en C

La fonction memccpy fait partie des utilitaires de chaînes de la bibliothèque standard utilisés pour concaténer les chaînes de tableaux argv. Notez que memccpy est similaire à memcpy sauf qu’il prend le quatrième argument pour spécifier le caractère quand arrêter la copie. Nous exploitons cette dernière fonctionnalité pour copier uniquement le contenu de la chaîne et nous arrêtons à la fin de l’octet nul. Dans l’exemple suivant, nous vérifions si l’utilisateur a fourni précisément deux arguments (à l’exception du nom du programme) et seulement ensuite nous poursuivons l’exécution du programme. Par conséquent, nous enchaînons deux appels memccpy pour copier les deux arguments et imprimer la chaîne concaténée sur le stdout.

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

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program string1 string2\n");
    exit(EXIT_FAILURE);
  }

  size_t size = strlen(argv[1]) + strlen(argv[2]);
  char buf[size];

  memccpy(memccpy(buf, argv[1], '\0', size) - 1, argv[2], '\0', size);
  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

Production :

hellothere
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

Article connexe - C Process