Comprendre argc et argv en C++

Comprendre argc et argv en C++

Amine Abidi - Lead Software Engineer C++/Qt - Associé PointerLab

Publié par Amine Abidi - Lead Software Engineer C++/Qt - Associé PointerLab

Introduction

Les arguments argc et argv jouent un rôle essentiel pour les programmes en ligne de commande en C++. Ils permettent à un programme de recevoir des entrées externes directement depuis la ligne de commande, rendant vos outils interactifs et dynamiques.

Dans cet article, nous allons explorer :

  • Ce que sont argc et argv.
  • Leur utilité et leur fonctionnement.
  • Comment les utiliser efficacement avec des exemples pratiques.
  • Les bonnes pratiques et les erreurs courantes.

1. Qu’est-ce que argc et argv ?

Dans une fonction main, on peut ajouter deux paramètres spéciaux pour gérer les arguments en ligne de commande :

int main(int argc, char* argv[]) {
    // Code
}

Explications des paramètres argc et argv

  1. argc (Argument Count) :

    • Représente le nombre d'arguments passés, y compris le nom du programme.
  2. argv (Argument Vector) :

    • Est un tableau de chaînes de caractères contenant les arguments.
    • argv[0] : Toujours le nom ou le chemin d'accès au programme.
    • Les autres éléments (argv[1], argv[2], etc.) contiennent les arguments passés.

** Exemple de base :**

Un programme simple qui affiche le nombre d'arguments et leur contenu.

#include <iostream>

int main(int argc, char* argv[]) {
    std::cout << "Nombre d'arguments : " << argc << std::endl;

    for (int i = 0; i < argc; i++) {
        std::cout << "Argument " << i << " : " << argv[i] << std::endl;
    }

    return 0;
}

** Exécution : **

./programme arg1 arg2 arg3

Résultat :

Nombre d'arguments : 4
Argument 0 : ./programme
Argument 1 : arg1
Argument 2 : arg2
Argument 3 : arg3

2. Utilité de argc et argv

Pourquoi utiliser ces arguments ?

  1. Personnaliser l'exécution du programme :

    • Les utilisateurs peuvent fournir des données ou des options directement depuis la ligne de commande.
  2. Créer des outils puissants :

    • Permet de développer des applications comme des calculatrices, des analyseurs de fichiers ou des outils de recherche.
  3. Automatisation :

    • Les arguments permettent d'exécuter des programmes sans interaction utilisateur directe, facilitant les tâches répétitives.

3. Exemples Pratiques

Exemple 1 : Vérifier le nombre d'arguments

Un programme qui s'assure qu'un argument a bien été passé.

#include <iostream>

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << "Erreur : Aucun argument fourni." << std::endl;
        return 1;
    }

    std::cout << "Argument fourni : " << argv[1] << std::endl;
    return 0;
}

Exécution :

./programme utilisateur

Résultat :

Argument fourni : utilisateur

Exemple 2 : Traitement des arguments

Un programme qui accepte deux nombres et un opérateur pour effectuer un calcul simple.

#include <iostream>
#include <cstdlib> // Pour std::atoi

int main(int argc, char* argv[]) {
    if (argc != 4) {
        std::cerr << "Usage : " << argv[0] << " <nombre1> <opérateur> <nombre2>" << std::endl;
        return 1;
    }

    int nombre1 = std::atoi(argv[1]); // Conversion du premier argument
    char operateur = argv[2][0];      // L'opérateur est un caractère
    int nombre2 = std::atoi(argv[3]); // Conversion du troisième argument

    switch (operateur) {
        case '+':
            std::cout << "Résultat : " << (nombre1 + nombre2) << std::endl;
            break;
        case '-':
            std::cout << "Résultat : " << (nombre1 - nombre2) << std::endl;
            break;
        case '*':
            std::cout << "Résultat : " << (nombre1 * nombre2) << std::endl;
            break;
        case '/':
            if (nombre2 != 0) {
                std::cout << "Résultat : " << (nombre1 / nombre2) << std::endl;
            } else {
                std::cerr << "Erreur : Division par zéro !" << std::endl;
            }
            break;
        default:
            std::cerr << "Erreur : Opérateur non supporté." << std::endl;
    }

    return 0;
}

Exécution :

./calculatrice 10 + 5

Résultat :

Résultat : 15

Exemple 3 : Programme d'aide

Un programme qui affiche un message d'aide si l'utilisateur demande une option spécifique (--help).

#include <iostream>
#include <string>

int main(int argc, char* argv[]) {
    if (argc == 2 && std::string(argv[1]) == "--help") {
        std::cout << "Usage : ./programme [options]" << std::endl;
        std::cout << "--help     Affiche ce message d'aide" << std::endl;
        return 0;
    }

    std::cout << "Lancez le programme avec --help pour obtenir de l'aide." << std::endl;
    return 0;
}

Exécution :

./programme --help

Résultat :

Usage : ./programme [options]
--help     Affiche ce message d'aide

4. Bonnes Pratiques

Bonnes pratiques pour gérer les arguments en ligne de commande

  1. Validez systématiquement les arguments :

    • Vérifiez que argc contient le bon nombre d'arguments avant de les utiliser.
    • Si un argument manque, affichez un message d'erreur explicite.
  2. Affichez un message d'aide :

    • Fournissez des instructions claires sur l'utilisation du programme.
  3. Traitez les erreurs de conversion :

    • Utilisez des fonctions comme std::stoi ou std::stof pour convertir les arguments.
    • Gérez les exceptions pour éviter les plantages.
  4. Utilisez des bibliothèques pour gérer les arguments complexes :

    • Des outils comme Boost.Program_options ou cxxopts facilitent la gestion des options en ligne de commande.

5. Limites de argc et argv

Limitations de l'utilisation des arguments en ligne de commande

  1. Pas de vérification automatique des types :

    • Tous les arguments sont passés sous forme de chaînes de caractères (char*) et doivent être convertis manuellement.
  2. Syntaxe basique :

    • Pour des options plus complexes (comme --option=value), vous devrez écrire beaucoup de code ou utiliser une bibliothèque tierce.

Conclusion

Les arguments argc et argv sont essentiels pour rendre vos programmes C++ interactifs et utiles en ligne de commande. Ils permettent d'accepter des données ou des options directement depuis l'utilisateur, ce qui est indispensable pour de nombreux outils et applications.

Dans un prochain article, nous explorerons comment simplifier la gestion des arguments en ligne de commande avec des bibliothèques dédiées comme Boost ou cxxopts pour des applications plus avancées !


À propos de pointerlab

Chez pointerlab, nous mettons notre expertise unique en C, C++, Qt, OpenGL et bien d'autres technologies au service des entreprises. Que vous ayez besoin de solutions sur mesure pour la simulation 3D, les systèmes embarqués, ou des projets innovants dans des secteurs comme l’aéronautique, le médical ou l’énergie, nous vous accompagnons dans le développement de logiciels métiers.

Vous avez un projet ? Contactez-nous dès maintenant pour discuter de vos besoins et découvrir comment nous pouvons collaborer.

Vous êtes ingénieur logiciel C++ ? Rejoignez-nous ! Découvrez nos opportunités ici et contribuez à façonner l’avenir des logiciels d'excellence.

Rejoignez la communauté C++ France sur Discord !

Développez votre réseau et boostez votre carrière avec la communauté C++ France