Ce n'int argc, char *argv[] signifie?

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

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

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

int main()

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

397
demandé sur Rodrigo de Azevedo 2010-06-11 19:45:43

8 réponses

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

argc sera le nombre de cordes pointées par argv . Ceci sera (en pratique) 1 plus le nombre d'arguments, puisque pratiquement toutes les implémentations vont pré-coller le nom du programme au tableau.

Les variables sont nommées argc ( "1519170920 argument de" compter ) et argv ( argument vector ) par convention, mais ils peuvent être donnés n'importe quel identifiant valide: int main(int num_args, char** arg_strings) est également valide.

ils peuvent aussi être entièrement omis, donnant int main() , si vous n'avez pas l'intention de traiter des arguments en 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 produira

Have 4 arguments:
./test
a1
b2
c3
525
répondu meagar 2011-07-05 14:32:59

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

vous pouvez boucler les arguments en sachant le nombre d'entre eux comme:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
45
répondu John Boker 2016-08-23 19:52:58

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

myprog arg1 arg2 'arg 3'

si vous avez déclaré votre main comme int main(int argc, char *argv[]) , alors (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 avez déclaré votre main comme int main() , il sera appelé quelque chose comme

exit(main());

et vous ne faites pas passer les arguments.

deux autres points à noter:

  1. il s'agit des deux seules signatures normalisées pour main . Si une plate-forme particulière accepte des arguments supplémentaires ou un type de retour différent, alors c'est une extension et ne devrait pas être utilisé dans un programme portable.
  2. *argv[] et **argv sont exactement équivalentes, de sorte que vous pouvez écrire int main(int argc, char *argv[]) comme int main(int argc, char **argv) .
14
répondu Toby Speight 2017-01-23 12:34:12

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

7
répondu BlueMonkMN 2018-04-20 11:50:18

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

5
répondu Nick Gerakines 2010-06-11 15:48:03

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

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

paramètre argv pointe vers un tableau de chaînes de caractères et est appelé le argument vector . C'est un tableau de chaîne de caractères unidimensionnel des arguments de fonction.

5
répondu moshtagh 2018-04-20 11:51:49
int main();

C'est une simple déclaration. Il ne peut accepter aucun argument en ligne de commande.

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

cette déclaration est utilisée lorsque votre programme doit prendre des arguments en ligne de commande. Quand on court comme ça:

myprogram arg1 arg2 arg3

argc , ou le nombre D'arguments, sera défini à 4 (quatre arguments), et argv , ou Vecteurs D'arguments, sera peuplé avec des pointeurs de chaîne de caractères à "myprogram", "arg1", "arg2", et "arg3". le l'invocation de 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 ceci:

SHELL=/bin/bash    

la liste des variables d'environnement est nulle.

IMPORTANT: N'utilisez pas de valeurs argv ou envp directement dans les appels à system() ! Il s'agit d'un énorme trou de sécurité que les utilisateurs malveillants pourraient définir des variables d'environnement aux commandes en ligne de commande et (potentiellement) causer des dommages massifs. En général, n'utilisez pas system() . Il y a presque toujours une meilleure solution mise en œuvre par l'intermédiaire des bibliothèques C.

2
répondu Adrian Zhang 2018-04-05 05:50:28

les deux de

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

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

1
répondu Chris Becke 2013-09-10 00:06:22