Dans de nombreux IDE et compilateurs C ++, lorsqu'il génère la fonction principale pour vous, il ressemble à ceci:
int main(int argc, char *argv[])
Lorsque 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 est-ce vital pour mon programme?
c++
parameters
command-line-arguments
argv
argc
Greg Treleaven
la source
la source
int main(int argc, char* argv[], char* envp[])
et d'imprimer le dernier argument.;)
system()
appels, aux requêtes de base de données, etc. Comme d'habitude avec les entrées utilisateur.char **envp
argument?Réponses:
argv
etargc
comment les arguments de ligne de commande sont passésmain()
en C et C ++.argc
sera le nombre de chaînes pointées parargv
. Ce sera (en pratique) égal à 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 ) etargv
( vecteur d'arguments ) par convention, mais elles peuvent recevoir n'importe quel identifiant valide:int main(int num_args, char** arg_strings)
est également valide.Ils peuvent également être entièrement omis, ce qui donne
int main()
, si vous n'avez pas l'intention de traiter les arguments de ligne de commande.Essayez le programme suivant:
L'exécuter avec
./test a1 b2 c3
afficherala source
argc
peut être 0, auquel casargv
peut être NULL. C'est autorisé par la norme AFAIK. Je n'ai jamais entendu parler d'un système qui le fasse dans la pratique, mais il pourrait certainement exister et ne violerait aucune norme.argv[argc]
doit être 0" (C ++ 03 §3.6.1 / 2),argv
ne peut pas être nul.*NULL
n'est certainement pas égal àNULL
.argc
est le nombre d'arguments transmis à votre programme à partir de la ligne de commande etargv
est le tableau d'arguments.Vous pouvez parcourir les arguments en connaissant le nombre d'entre eux comme:
la source
Supposons que vous exécutiez votre programme ainsi (en utilisant la
sh
syntaxe):Si vous avez déclaré votre main comme
int main(int argc, char *argv[])
, alors (dans la plupart des environnements), votremain()
sera appelé comme si:Cependant, si vous avez déclaré votre principal comme
int main()
, il sera appelé quelque chose commeet vous ne faites pas passer les arguments.
Deux choses supplémentaires à noter:
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 doit pas être invoqué dans un programme portable.*argv[]
et**argv
sont exactement équivalents, vous pouvez donc écrire enint main(int argc, char *argv[])
tant queint main(int argc, char **argv)
.la source
basic.start.main/2
autorise explicitement les versions supplémentaires définies par l'implémentation demain()
, à condition que l'implémentation fournisse les deux versions prédéfinies. Donc, ils ne sont pas exactement non conformes. Le plus commun est l' unenvp
, qui est si bien connu dans les deux C et C ++ que c'est littéralement la toute première entrée dans la section J.5 (extensions communes) de la norme C .Les paramètres pour
main
représenter les paramètres de ligne de commande fournis au programme lors de son démarrage. Leargc
paramètre représente le nombre d'arguments de ligne de commande etchar *argv[]
est un tableau de chaînes (pointeurs de caractères) représentant les arguments individuels fournis sur la ligne de commande.la source
argv[0]
est ce que le programme de lancement du programme C lui a donnéargv[0]
. Dans le cas de Bash, c'est souvent (peut-être toujours) le nom de chemin de l'exécutable, mais Bash n'est pas le seul programme qui exécute d'autres programmes. Il est permissisble, si excentrique, à utiliser:char *args[] = { "cat", "/dev/null", "/etc/passwd", 0 }; execv("/bin/ls", args);
. Sur de nombreux systèmes, la valeur vue par le programmeargv[0]
seracat
, même si l'exécutable l'est/bin/ls
.La
main
fonction peut avoir deux paramètres,argc
etargv
.argc
est unint
paramètre integer ( ), et c'est le nombre d'arguments passés 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 un. Mais si un programme a lui-même deux arguments, la valeur deargc
sera de trois.Le paramètre
argv
pointe vers un tableau de chaînes et est appelé le vecteur d'argument . Il s'agit d'un tableau de chaînes unidimensionnel d'arguments de fonction.la source
Ceci est une simple déclaration. Il ne peut accepter aucun argument de ligne de commande.
Cette déclaration est utilisée lorsque votre programme doit accepter des arguments de ligne de commande. Lorsqu'il est exécuté comme tel:
argc
, ou Argument Count, sera défini sur 4 (quatre arguments) etargv
, ou Argument Vectors, seront remplis avec des pointeurs de chaîne sur "myprogram", "arg1", "arg2" et "arg3". Le programme invocation (myprogram
) est inclus dans les arguments!Alternativement, vous pouvez utiliser:
Ceci est également valable.
Il y a un autre paramètre que vous pouvez ajouter:
Le
envp
paramètre contient également des variables d'environnement. Chaque entrée suit ce format:comme ça:
La liste des variables d'environnement se termine par null.
IMPORTANT: N'UTILISEZ PAS les valeurs
argv
ouenvp
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 sur des commandes de ligne de commande et (potentiellement) causer des dommages massifs. En général, ne l'utilisez passystem()
. Il existe presque toujours une meilleure solution implémentée via les bibliothèques C.la source
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.
la source
Les deux
sont des définitions légales du point d'entrée d'un programme C ou C ++. Stroustrup: FAQ sur le style et la technique C ++ détaille certaines des variations possibles ou légales pour votre fonction principale.
la source
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 void d'avoir une liste de paramètres vide dans la déclaration.void
est nécessaire. 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.