709 votes

Qu'est-ce que signifient int argc, char *argv[]?

Dans de nombreux IDE et compilateurs C++, lorsque cela génère la fonction principale pour vous, cela ressemble à ceci:

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

Quand je code en C++ sans IDE, juste avec un compilateur en ligne de commande, je tape:

int main()

sans aucun paramètre. Que cela signifie-t-il et est-ce vital pour mon programme?

66 votes

Si votre programme va ignorer les arguments de la ligne de commande, alors ce que vous écrivez est correct. Si votre programme a besoin de traiter les arguments de la ligne de commande, alors l'EDI le fait correctement.

37 votes

Un conseil pour les hackers : essayez de déclarer int main(int argc, char* argv[], char* envp[]) et d'afficher le dernier argument. ;)

9 votes

@ulidtko ce n'est pas bien que vous enseigniez aux débutants à introduire des vulnérabilités dans leurs programmes ;)

889voto

meagar Points 85475

argv et argc sont comment les arguments de la ligne de commande sont passés à main() en C et C++.

argc sera le nombre de chaînes pointées par argv. Cela sera (en pratique) 1 plus le nombre d'arguments, car pratiquement toutes les implémentations ajouteront le nom du programme au tableau.

Les variables sont nommées argc (compteur d'arguments) et argv (vecteur d'arguments) par convention, mais elles peuvent recevoir n'importe quel identificateur valide : int main(int num_args, char** arg_strings) est également valide.

Ils peuvent également être omis entièrement, donnant int main(), si vous n'avez pas l'intention de traiter des arguments de ligne de commande.

Essayez le programme suivant :

#include 

int main(int argc, char** argv) {
    std::cout << "Have " << argc << " arguments:\n";
    for (int i = 0; i < argc; ++i) {
        std::cout << argv[i] << "\n";
    }
}

En l'exécutant avec ./test a1 b2 c3, le résultat sera :

Have 4 arguments:
./test
a1
b2
c3

83 votes

@Chuck: Puisque "La valeur de argv[argc] doit être 0" (C++03 §3.6.1/2), argv ne peut pas être nul.

0 votes

@James: Oh, bonne observation. Je pensais à C, qui a des règles subtilement différentes pour la balise main.

20 votes

@Chuck : C (au moins C99) a la même exigence.

67voto

John Boker Points 36308

argc est le nombre d'arguments passés à votre programme en ligne de commande et argv est le tableau d'arguments.

Vous pouvez parcourir les arguments en connaissant leur nombre comme suit :

for(int i = 0; i < argc; i++)
{
    // argv[i] est l'argument à l'indice i
}

11voto

BlueMonkMN Points 10838

Les paramètres de main représentent les paramètres de ligne de commande fournis au programme lors de son démarrage. Le paramètre argc représente le nombre d'arguments de ligne de commande, et char *argv[] est un tableau de chaînes de caractères (pointeurs de caractères) représentant les arguments individuels fournis en ligne de commande.

3 votes

Argv[] a toujours argv[arg] comme pointeur nul. et Argv[0] est toujours le chemin complet / nomExecutable comme une chaîne terminée par nul

3 votes

@user3629249: Pas nécessairement; argv[0] est ce que le programme lançant le programme C lui a donné comme argv[0]. Dans le cas de Bash, il s'agit souvent (voire toujours) du chemin d'accès de l'exécutable, mais Bash n'est pas le seul programme à exécuter d'autres programmes. Il est autorisé, bien que excentrique, d'utiliser: char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);. Sur de nombreux systèmes, la valeur vue par le programme comme argv[0] sera cat, même si l'exécutable est /bin/ls.

4voto

Nick Gerakines Points 1145

Le premier paramètre est le nombre d'arguments fournis et le deuxième paramètre est une liste de chaînes de caractères représentant ces arguments.

7 votes

La première entrée dans argv[0] est le nom du programme, pas un argument

0 votes

@user3629249 Nom du programme avec le chemin d'accès au programme. ;)

3voto

Andy Points 1150

C'est ainsi que les arguments de ligne de commande sont lus dans votre programme. En exécutant

$ monprogramme argument1 argument2

vous obtiendriez une valeur de 3 pour argc (il compte le nom de votre programme comme 1), et [argument1, argument2] dans le char*.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X