web-dev-qa-db-fra.com

Que signifie int argc, char * argv []?

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

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

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

int main()

sans aucun paramètre. Qu'est-ce que cela signifie et est-il vital pour mon programme?

464
Greg Treleaven

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

argc sera le nombre de chaînes pointées par argv. En pratique, il s'agira de 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 (nombre d'arguments) et argv (vecteur d'arguments), mais on peut leur attribuer tout identificateur valide: int main(int num_args, char** arg_strings) est également valide.

Ils peuvent également être entièrement omis, donnant int main(), si vous ne souhaitez pas traiter les arguments de ligne de commande.

Essayez le programme suivant:

#include <iostream>

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

L'exécuter avec ./test a1 b2 c3 affichera

Have 4 arguments:
./test
a1
b2
c3
597
meagar

argc est le nombre d'arguments transmis à votre programme à partir de la ligne de commande et argv est le tableau d'arguments.

Vous pouvez faire défiler les arguments en connaissant leur nombre, comme ceci:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
50
John Boker

Supposons que vous exécutiez votre programme ainsi (en utilisant la syntaxe sh):

myprog arg1 arg2 'arg 3'

Si vous avez déclaré votre fonction principale comme int main(int argc, char *argv[]), alors (dans la plupart des environnements), votre main() sera appelée comme si:

p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));

Cependant, si vous avez déclaré votre fonction principale comme int main(), elle s'appellera comme

exit(main());

et vous ne recevez pas les arguments.

Deux choses supplémentaires à noter:

  1. Il s’agit des deux seules signatures standard obligatoires pour main. Si une plate-forme particulière accepte des arguments supplémentaires ou un type de retour différent, il s'agit d'une extension qui ne doit pas être utilisée dans un programme portable.
  2. *argv[] et **argv sont exactement équivalents, vous pouvez donc écrire int main(int argc, char *argv[]) comme int main(int argc, char **argv).
17
Toby Speight

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 la ligne de commande et char *argv[] est un tableau de chaînes (pointeurs de caractères) représentant les arguments individuels fournis sur la ligne de commande.

8
BlueMonkMN

La fonction main peut avoir deux paramètres, argc et argv. argc est un paramètre entier (int), et correspond au nombre d'arguments transmis au programme.

Le nom du programme est toujours le premier argument, il y aura donc au moins un argument dans un programme et la valeur minimale de argc sera égale à un. Mais si un programme a lui-même deux arguments, la valeur de argc sera de trois.

Le paramètre argv pointe sur un tableau de chaînes et est appelé le vecteur d'argument. C'est un tableau de chaînes unidimensionnel d'arguments de fonction.

5
moshtagh

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

4
Nick Gerakines
int main();

Ceci est une simple déclaration. Il ne peut prendre aucun argument de ligne de commande.

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

Cette déclaration est utilisée lorsque votre programme doit prendre des arguments de ligne de commande. Lorsqu'il est exécuté comme tel:

myprogram arg1 arg2 arg3

argc, ou Argument Count, sera défini sur 4 (quatre arguments), et argv, ou Argument Vectors, sera renseigné avec des pointeurs de chaîne sur "myprogram", "arg1", "arg2", et "arg3". L'invocation du programme (myprogram) est incluse dans les arguments!

Alternativement, vous pouvez utiliser:

int main(int argc, char** argv);

Ceci est également valable.

Il y a un autre paramètre que vous pouvez ajouter:

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

Le paramètre envp contient également des variables d'environnement. Chaque entrée suit ce format:

VARIABLENAME=VariableValue

comme ça:

Shell=/bin/bash    

La liste des variables d'environnement est terminée par un zéro.

IMPORTANT: N'UTILISEZ aucune valeur argv ou envp directement dans les appels à system()! Il s'agit d'un énorme trou de sécurité, car des utilisateurs malveillants pourraient définir des variables d'environnement comme des commandes de ligne de commande et (potentiellement) causer des dommages considérables. En général, n'utilisez pas system(). Il y a presque toujours une meilleure solution implémentée via les bibliothèques C.

4
Adrian Zhang

Les deux

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

sont les définitions légales du point d'entrée d'un programme C ou C++. Stroustrup: FAQ sur les styles et techniques C++ détaille certaines des variations possibles ou légales pour votre fonction principale.

1
Chris Becke