104 votes

Concernant "main(int argc, char *argv[])".

Duplicatas possibles :
A quoi servent les arguments de main() ?
Que signifie int argc, char *argv[] ?

Chaque programme commence par le main(int argc, char *argv[]) définition.

Je ne comprends pas ce que cela signifie. Je serais très heureux si quelqu'un pouvait m'expliquer pourquoi nous utilisons ces arguments si nous ne les utilisons pas dans le programme ? Pourquoi pas simplement : int main() ?

Est-ce que le nom du programme est un des éléments de *argv[] et argc est le compte du nombre d'arguments dans *argv[] ? Quels sont les autres arguments envoyés à *argv[] ? Comment les envoyer ?

131voto

Frank Points 657

Les arguments argc et argv de main est utilisé comme moyen d'envoyer des arguments à un programme, la façon la plus familière est probablement d'utiliser le bon vieux terminal où un utilisateur pourrait taper <code>cat file</code> . Ici, le mot cat est un programme qui prend un fichier et le sort sur la sortie standard ( stdout ).

Le programme reçoit le nombre d'arguments dans argc et le vecteur d'arguments dans argv dans l'article ci-dessus. arg ument c serait de deux (le nom du programme compte comme premier argument) et la valeur de arg ument v ecteur contiendrait [ cat , file , null ]. Le dernier élément étant un pointeur nul.

En général, vous l'écrivez comme ceci :

int  // Specifies that type of variable the function returns.
     // main() must return an integer
main ( int argc, char **argv ) {
     // code
     return 0; // Indicates that everything went well.
}

Si votre programme ne nécessite pas d'arguments, il est tout aussi valable d'écrire un programme de type main -de la manière suivante :

int main() {
  // code
  return 0; // Zero indicates success, while any 
  // Non-Zero value indicates a failure/error
}

Dans les premières versions du langage C, il n'y avait aucune int avant main car cela était implicite. Aujourd'hui, cela est considéré comme une erreur.

Sur POSIX -(et Windows), il existe la possibilité d'utiliser un troisième paramètre. char **envp qui contient un vecteur des programmes env. variables de l'environnement . D'autres variations de la liste d'arguments de la méthode main existe, mais je ne la détaillerai pas ici car elle n'est pas standard.

De même, la dénomination des variables est une convention et n'a aucune signification réelle. Il est toujours bon de s'y tenir afin de ne pas confondre les autres, mais il serait tout aussi valide de définir main comme

int main(int c, char **v, char **e) {
   // code
   return 0;
}

Et pour votre deuxième question, il existe plusieurs façons d'envoyer des arguments à un programme. Je vous recommande de consulter le exec*() famille de fonctions qui est POSIX -standard, mais il est probablement plus facile d'utiliser simplement system("command arg1 arg2") mais l'utilisation de system() est généralement désapprouvé car il n'est pas garanti qu'il fonctionne sur tous les systèmes. Je ne l'ai pas testé moi-même, mais s'il n'y a pas d'erreur, il est possible de l'utiliser. bash , zsh ou tout autre shell installé sur un système *NIX, system() échouera.

71voto

Arun Points 6838

Ils servent à transmettre des arguments à votre programme, par exemple à partir de la ligne de commande, lorsqu'un programme est invoqué.

$ gcc mysort.c -o mysort

$ mysort 2 8 9 1 4 5

Ci-dessus, le programme mysort est exécuté avec certains paramètres de ligne de commande. À l'intérieur de main( int argc, char * argv[]) ce qui aurait pour conséquence

Argument Count, argc = 7 

puisqu'il y a 7 arguments (en comptant le programme), et

Argument Vector, argv[] = { "mysort", "2", "8", "9", "1", "4", "5" };

Voici un exemple complet.

$ cat mysort.c
#include <stdio.h>
int main( int argc, char * argv [] ) {
    printf( "argc = %d\n", argc );
    for( int i = 0; i < argc; ++i ) {
        printf( "argv[ %d ] = %s\n", i, argv[ i ] );
    }
}

$ gcc mysort.c -o mysort

$ ./mysort 2 8 9 1 4 5
argc = 7
argv[ 0 ] = ./mysort
argv[ 1 ] = 2
argv[ 2 ] = 8
argv[ 3 ] = 9
argv[ 4 ] = 1
argv[ 5 ] = 4
argv[ 6 ] = 5

[Le char Les chaînes de caractères "2", "8", etc. peuvent être converties en nombre à l'aide d'une fonction de conversion de caractères en nombres. atol() (lien )]

16voto

Colin Hebert Points 40084

Avec argc (nombre d'arguments) et argv (vecteur d'arguments) vous pouvez obtenir le nombre et les valeurs des arguments passés lorsque votre application a été lancée.

De cette façon, vous pouvez utiliser des paramètres (tels que -version ) lorsque votre application est lancée pour agir d'une manière différente.

Mais vous pouvez aussi utiliser int main(void) comme un prototype en C.

Il existe un troisième prototype (moins connu et non standard) avec un troisième argument qui est envp . Il contient des variables d'environnement.


Ressources :

3voto

kraftan Points 3061

argc signifie le nombre d'arguments qui sont passés au programme. char* argv[] sont les arguments passés. argv[0] est toujours le nom du programme lui-même. Je ne suis pas sûr à 100%, mais je pense que int main() est valable en C/C++.

1voto

You Points 8861

argc est le nombre d'arguments de ligne de commande donnés au programme lors de l'exécution, et argv est un tableau de tableaux de caractères (plutôt, un tableau de chaînes C) contenant ces arguments. Si vous savez que vous n'aurez pas besoin des arguments de la ligne de commande, vous pouvez déclarer que votre commande principale prend un fichier void à la place :

int main(void) {
    /* ... */ 
}

Ce sont les deux seuls prototypes définis pour main selon les normes, mais certains compilateurs permettent un type de retour de void également. Plus d'informations à ce sujet sur Wikipédia .

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