2010-06-11 7 views
348

Dans de nombreux C++ IDE et compilateurs, quand il génère la fonction principale pour vous, il ressemble à ceci:Que veut dire int argc, char * argv []?

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

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

int main() 

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

+35

Si votre programme ignore les arguments de la ligne de commande, alors ce que vous écrivez est correct. Si votre programme doit traiter les arguments de la ligne de commande, l'EDI le fait correctement. –

+17

Un indice pour les pirates: essayez de déclarer 'int main (int argc, char * argv [], char * envp [])' et d'imprimer le dernier argument. ';)' – ulidtko

+4

@ulidtko il n'est pas bon que vous appreniez aux débutants à introduire la vulnérabilité dans leurs programmes;) –

Répondre

476

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

argc sera le nombre de chaînes pointé par argv. Ce 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 (argument de nombre) et argv (vecteur argument) par convention, mais ils peuvent donner un identifiant valide: int main(int num_args, char** arg_strings) est également valide.

Ils peuvent également être complètement omis, en générant int main(), si vous n'avez pas l'intention de 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; 
    } 
} 

Exécution avec sortie ./test a1 b2 c3 volonté

Have 4 arguments: 
./test 
a1 
b2 
c3 
+7

'argc' peut être 0, auquel cas' argv' peut être NULL. C'est permis par la norme AFAIK. Je n'ai jamais entendu parler d'un système qui le fait dans la pratique, mais il pourrait certainement exister et ne viole aucune norme. – Chuck

+63

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

+0

@James: Oh, bon point. Je pensais à C, qui a des règles subtilement différentes pour 'main'. – Chuck

42

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

Vous pouvez parcourir les arguments connaître le nombre d'entre eux comme:

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

Les paramètres principaux à représenter les paramètres de ligne de commande fournis au programme quand il a commencé. Le paramètre argc représente le nombre d'arguments de 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.

+2

Argv [] a toujours argv [arg] comme pointeur nul. et Argv [0] est toujours le (nom complet)/nom exécutable sous la forme d'une chaîne terminée par zéro – user3629249

+2

@ user3629249: Pas nécessairement; 'argv [0]' est ce que le programme C qui lance le programme C l'a nommé 'argv [0]'. Dans le cas de Bash, c'est souvent (peut-être toujours) le chemin de l'exécutable, mais Bash n'est pas le seul programme qui exécute d'autres programmes. Il est permissisable, bien qu'excentrique, d'utiliser: 'char * args [] = {" cat ","/dev/null ","/etc/passwd ", 0}; execv ("/ bin/ls", arguments); Sur beaucoup de systèmes, la valeur vue par le programme comme 'argv [0]' sera 'cat', même si l'exécutable est'/bin/ls'. –

5

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.

+5

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

1

deux

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

sont des définitions juridiques du point d'entrée pour un programme C ou C++. Stroustrup: C++ Style and Technique FAQ détaille certaines des variantes possibles ou légales pour votre fonction principale.

+2

Peut vouloir mettre void dans ... 'int main()' ==> 'int main (void)' ... pour la compatibilité et la lisibilité . Je ne sais pas si toutes les anciennes versions de C permettent aux fonctions vides d'avoir une liste de paramètres vide dans la déclaration. – dylnmc

+1

@dylnmc cela ne donne aucun gain de lisibilité, et est exactement équivalent dans toutes les versions C++. Seulement en C cela a une différence, mais seulement dans les déclarations, pas dans la définition. – Ruslan

+0

@Ruslan Désolé, j'ai posté ceci quand j'apprenais juste C, et j'aurais pu lire que dans les toutes premières versions de C le 'void' est requis. Ne me citez pas là-dessus, et je sais maintenant que c'est un commentaire un peu stupide. Cela ne peut pas faire de mal, cependant. – dylnmc

5

La fonction main peut avoir deux paramètres, argc et argv.argc est un paramètre entier, et c'est le nombre d'arguments passés au programme.

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

Paramètre argv pointe vers un tableau de chaînes et est appelé le « vecteur argument ». C'est un tableau de chaîne unidimensionnel d'arguments de fonction.

+1

ça va être utile aussi: http://crasseux.com/books/ctutorial/argc-and-argv.html – moshtagh

11

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

myprog arg1 arg2 'arg 3' 

Si vous déclarez votre principal comme int main(int argc, char *argv[]), puis (dans la plupart des environnements), votre main() sera appelé comme si, comme:

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

Cependant, si vous déclarez votre principal comme int main(), il sera appelé quelque chose comme

exit(main()); 

et que les arguments ne sont pas transmis.

Deux choses à noter:

  1. Ce sont les deux seules signatures standards mandatée pour main. Si une plateforme particulière accepte des arguments supplémentaires ou un type de retour différent, il s'agit d'une extension et ne devrait pas être utilisée dans un programme portable.
  2. *argv[] et **argv sont exactement équivalents, de sorte que vous pouvez écrire int main(int argc, char *argv[]) comme int main(int argc, char **argv).
+1

Si nous sommes techniques, ['basic.start.main/2'] (https://timsong-cpp.github.io/cppwp/basic.start.main#2) autorise explicitement des versions supplémentaires définies par l'implémentation de 'main()', à condition que l'implémentation fournisse les deux versions prédéfinies. Donc, ils ne sont pas exactement non conformes. Le plus commun est 'envp', qui est si bien connu en C et en C++ que [c'est littéralement la toute première entrée dans la section J.5 (extensions communes) de la norme C] (http://port70.net /~nsz/c/c11/n1570.html#J.5). –

+0

Merci pour le bon pedantry @ Justin. Réponse mise à jour pour être plus correcte. –

+0

@TobySpeight \t Que se passe-t-il si argc <3 renvoie une erreur? qu'est-ce qui pourrait avoir mal tourné? – AVI

1
int main(); 

Ceci est une simple déclaration. Il ne peut pas prendre d'arguments 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. Lors de l'exécution comme par exemple:

myprogram arg1 arg2 arg3 

argc ou Argument Count, sera réglé sur 4 (quatre arguments), et argv ou vecteurs d'arguments, seront remplis avec des pointeurs de chaîne pour "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, vous pouvez ajouter:

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

Le paramètre envp contient également des variables d'environnement. Chaque entrée a le format suivant:

VARIABLENAME=VariableValue 

comme ceci:

SHELL=/bin/bash  

Les variables d'environnement liste est nul terminé.

Questions connexes