Recherche…


Syntaxe

  • int main (int argc, char * argv [])

Paramètres

Paramètre Détails
argc nombre d'arguments - initialisé au nombre d'arguments séparés par des espaces donnés au programme à partir de la ligne de commande, ainsi qu'au nom du programme lui-même.
argv vecteur d'argument - initialisé à un tableau de char -pointers (chaînes) contenant les arguments (et le nom du programme) donnés sur la ligne de commande.

Remarques

Le programme AC s'exécutant dans un environnement hébergé (le type normal, par opposition à un environnement autonome) doit avoir une fonction main . Il est traditionnellement défini comme suit:

int main(int argc, char *argv[])

Notez que argv peut également être et est très souvent défini comme étant un caractère char **argv ; le comportement est le même. En outre, les noms de paramètres peuvent être modifiés car ils ne sont que des variables locales dans la fonction, mais argc et argv sont conventionnels et vous devriez les utiliser.

Pour les fonctions main où le code n'utilise aucun argument, utilisez int main(void) .

Les deux paramètres sont initialisés au démarrage du programme:

  • argc est initialisé au nombre d'arguments séparés par des espaces donnés au programme à partir de la ligne de commande, ainsi qu'au nom du programme lui-même.
  • argv est un tableau de char -pointers (chaînes) contenant les arguments (et le nom du programme) donnés sur la ligne de commande.
  • Certains systèmes étendent les arguments de ligne de commande "dans le shell", d'autres non. Sur Unix si l'utilisateur tape myprogram *.txt le programme recevra une liste de fichiers texte; sous Windows, il recevra la chaîne " *.txt ".

Remarque: Avant d'utiliser argv , vous devrez peut-être vérifier la valeur de argc . En théorie, argc pourrait être 0 , et si argc est zéro, alors il n'y a pas d'argument et argv[0] (équivalent à argv[argc] ) est un pointeur nul. Ce serait un système inhabituel avec un environnement hébergé si vous rencontriez ce problème. De même, il est possible, bien que très inhabituel, qu’il n’y ait aucune information sur le nom du programme. Dans ce cas, argv[0][0] == '\0' - le nom du programme peut être vide.

Supposons que nous démarrions le programme comme ceci:

./some_program abba banana mamajam

Alors argc est égal à 4 , et les arguments de ligne de commande:

  • argv[0] pointe sur "./some_program" (le nom du programme) si le nom du programme est disponible dans l'environnement hôte. Sinon une chaîne vide "" .
  • argv[1] désigne "abba" ,
  • argv[2] désigne "banana" ,
  • argv[3] désigne "mamajam" ,
  • argv[4] contient la valeur NULL .

Voir aussi Que devrait main() retourner en C et C ++ pour les guillemets complets du standard.

Impression des arguments de la ligne de commande

Après avoir reçu les arguments, vous pouvez les imprimer comme suit:

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

Remarques

  1. Le paramètre argv peut également être défini comme étant char *argv[] .
  2. argv[0] peut contenir le nom du programme lui-même (en fonction de l'exécution du programme). Le premier argument "réel" de la ligne de commande est à argv[1] , et c'est la raison pour laquelle la variable de boucle i est initialisée à 1.
  3. Dans l'instruction print, vous pouvez utiliser *(argv + i) au lieu de argv[i] - il évalue la même chose, mais est plus verbeux.
  4. Les crochets autour de la valeur de l'argument aident à identifier le début et la fin. Cela peut être inestimable s'il y a des blancs, des nouvelles lignes, des retours chariot ou d'autres caractères inhabituels dans l'argument. Certaines variantes de ce programme sont un outil utile pour déboguer des scripts shell dans lesquels vous devez comprendre ce que contient la liste d'arguments (bien qu'il existe des alternatives de shell simples, presque équivalentes).

Imprimer les arguments dans un programme et convertir en valeurs entières

Le code suivant imprimera les arguments au programme et le code tentera de convertir chaque argument en un nombre (à un long ):

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

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

    for (int i = 1; i < argc; i++) {
        printf("Argument %d is: %s\n", i, argv[i]);

        errno = 0;
        char *p;
        long argument_numValue = strtol(argv[i], &p, 10);

        if (p == argv[i]) {
            fprintf(stderr, "Argument %d is not a number.\n", i);
        }
        else if ((argument_numValue == LONG_MIN || argument_numValue == LONG_MAX) && errno == ERANGE) {
            fprintf(stderr, "Argument %d is out of range.\n", i);
        }
        else {
            printf("Argument %d is a number, and the value is: %ld\n",
                   i, argument_numValue);
        }
    }
    return 0;
}

LES RÉFÉRENCES:

Utiliser les outils GNU getopt

Les options de ligne de commande pour les applications ne sont pas traitées différemment des arguments de ligne de commande par le langage C. Ce ne sont que des arguments qui, dans un environnement Linux ou Unix, commencent traditionnellement par un tiret ( - ).

Avec glibc dans un environnement Linux ou Unix, vous pouvez utiliser les outils getopt pour définir, valider et analyser facilement les options de ligne de commande du reste de vos arguments.

Ces outils s'attendent à ce que vos options soient formatées conformément aux normes de codage GNU , qui sont une extension de ce que POSIX spécifie pour le format des options de ligne de commande.

L'exemple ci-dessous illustre la gestion des options de ligne de commande avec les outils GNU getopt.

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

/* print a description of all supported options */
void usage (FILE *fp, const char *path)
{
    /* take only the last portion of the path */
    const char *basename = strrchr(path, '/');
    basename = basename ? basename + 1 : path;

    fprintf (fp, "usage: %s [OPTION]\n", basename);
    fprintf (fp, "  -h, --help\t\t"
                 "Print this help and exit.\n");
    fprintf (fp, "  -f, --file[=FILENAME]\t"
                 "Write all output to a file (defaults to out.txt).\n");
    fprintf (fp, "  -m, --msg=STRING\t"
                 "Output a particular message rather than 'Hello world'.\n");
}

/* parse command-line options and print message */
int main(int argc, char *argv[])
{
    /* for code brevity this example just uses fixed buffer sizes for strings */
    char filename[256] = { 0 };
    char message[256] = "Hello world";
    FILE *fp;
    int help_flag = 0;
    int opt;

    /* table of all supported options in their long form.
     * fields: name, has_arg, flag, val
     * `has_arg` specifies whether the associated long-form option can (or, in
     * some cases, must) have an argument. the valid values for `has_arg` are
     * `no_argument`, `optional_argument`, and `required_argument`.
     * if `flag` points to a variable, then the variable will be given a value
     * of `val` when the associated long-form option is present at the command
     * line.
     * if `flag` is NULL, then `val` is returned by `getopt_long` (see below)
     * when the associated long-form option is found amongst the command-line
     * arguments.
     */
    struct option longopts[] = {
        { "help", no_argument, &help_flag, 1 },
        { "file", optional_argument, NULL, 'f' },
        { "msg", required_argument, NULL, 'm' },
        { 0 }
    };

    /* infinite loop, to be broken when we are done parsing options */
    while (1) {
        /* getopt_long supports GNU-style full-word "long" options in addition
         * to the single-character "short" options which are supported by
         * getopt.
         * the third argument is a collection of supported short-form options.
         * these do not necessarily have to correlate to the long-form options.
         * one colon after an option indicates that it has an argument, two
         * indicates that the argument is optional. order is unimportant.
         */
        opt = getopt_long (argc, argv, "hf::m:", longopts, 0);

        if (opt == -1) {
            /* a return value of -1 indicates that there are no more options */
            break;
        }

        switch (opt) {
        case 'h':
            /* the help_flag and value are specified in the longopts table,
             * which means that when the --help option is specified (in its long
             * form), the help_flag variable will be automatically set.
             * however, the parser for short-form options does not support the
             * automatic setting of flags, so we still need this code to set the
             * help_flag manually when the -h option is specified.
             */
            help_flag = 1;
            break;
        case 'f':
            /* optarg is a global variable in getopt.h. it contains the argument
             * for this option. it is null if there was no argument.
             */
            printf ("outarg: '%s'\n", optarg);
            strncpy (filename, optarg ? optarg : "out.txt", sizeof (filename));
            /* strncpy does not fully guarantee null-termination */
            filename[sizeof (filename) - 1] = '\0';
            break;
        case 'm':
            /* since the argument for this option is required, getopt guarantees
             * that aptarg is non-null.
             */
            strncpy (message, optarg, sizeof (message));
            message[sizeof (message) - 1] = '\0';
            break;
        case '?':
            /* a return value of '?' indicates that an option was malformed.
             * this could mean that an unrecognized option was given, or that an
             * option which requires an argument did not include an argument.
             */
            usage (stderr, argv[0]);
            return 1;
        default:
            break;
        }
    }

    if (help_flag) {
        usage (stdout, argv[0]);
        return 0;
    }

    if (filename[0]) {
        fp = fopen (filename, "w");
    } else {
        fp = stdout;
    }

    if (!fp) {
        fprintf(stderr, "Failed to open file.\n");
        return 1;
    }

    fprintf (fp, "%s\n", message);

    fclose (fp);
    return 0;
}

Il peut être compilé avec gcc :

gcc example.c -o example

Il prend en charge trois options de ligne de commande ( --help , --file et --msg ). Tous ont aussi une "forme courte" ( -h , -f et -m ). Les options "fichier" et "msg" acceptent toutes deux des arguments. Si vous spécifiez l'option "msg", son argument est requis.

Les arguments pour les options sont formatés comme suit:

  • --option=value (pour les options de formulaire long)
  • -ovalue ou -o"value" (pour les options -ovalue )


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow