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

duplicata possibles:

Quels sont les arguments pour main ()?

que signifie int argc, char * argv []?

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

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

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

73
demandé sur Rodrigo de Azevedo 2010-10-10 01:54:27

8 réponses

les arguments argc et argv de main est utilisé comme un moyen d'envoyer des arguments à un programme, le moyen probablement le plus familier est d'utiliser le bon vieux terminal où un utilisateur pourrait taper cat file . Ici, le mot cat est un programme qui prend un fichier et le produit à la sortie standard ( stdout ).

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

habituellement, vous l'écririez 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 également valide d'écrire une main - fonction de la façon suivante:

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

dans les premières versions de la langue C, il n'y avait pas de int avant main comme cela était implicite. Aujourd'hui, c'est considéré comme une erreur.

sur POSIX systèmes compatibles (et Windows), il existe la possibilité d'utiliser un troisième paramètre char **envp qui contient un vecteur des programmes env gée variables . D'autres variantes de la liste d'arguments de la fonction main existent, mais je ne vais pas le détailler ici car il n'est pas standard.

aussi, le nom des variables est un convention et n'a pas de sens réel. C'est toujours une bonne idée d'adhérer à ce que vous ne confondez pas les autres, mais il serait tout aussi valable pour définir main comme

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

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

92
répondu Frank 2016-06-12 09:36:40

ceux-ci sont pour passer des arguments à votre programme, par exemple à partir de la ligne de commande, quand 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 quelques paramètres de ligne de commande. À l'intérieur de main( int argc, char * argv[]) , ce qui entraînerait des

Argument Count, argc = 7 

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

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

en 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 chaînes "2", "8", etc. peut être converti en nombre en utilisant une fonction de conversion de caractère en nombre, p.ex. atol() (lien )]

48
répondu Arun 2017-05-15 22:24:09

avec argc (argument count) et argv (argument vector) 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 prototype en C.

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


ressources:

13
répondu Colin Hebert 2016-08-23 20:00:35

argc signifie le nombre d'arguments 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 valide en C/C++.

3
répondu kraftan 2010-10-09 21:57:29

Le comp.lang.C FAQ traite de la question

"What's the correct declaration of main()?"
dans Question 11.12 a .
1
répondu cschol 2010-10-09 22:06:51

argc est le nombre d'arguments en ligne de commande et argv est un tableau de chaînes représentant les arguments en ligne de commande.

Cela vous donne la possibilité de réagir aux arguments passés au programme. Si vous n'en attendez aucune, Vous pouvez aussi bien utiliser int main .

0
répondu Aliostad 2010-10-09 21:55:49

argc est le nombre d'arguments en ligne de commande donnés au programme à l'exécution, et argv est un tableau de tableaux de caractères (plutôt, un tableau de C-strings) contenant ces arguments. Si vous savez que vous n'allez pas avoir besoin des arguments en ligne de commande, vous pouvez déclarer votre main à prendre un argument void , à la place:

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

ce sont les deux seuls prototypes définis pour main , selon les normes, mais certains compilateurs autoriser un type de retour de void ainsi. Plus sur ce sur Wikipedia .

0
répondu You 2010-10-09 21:59:15

Vous pouvez exécuter votre application avec des paramètres tels que app -something -somethingelse . int argc représente le nombre de ces paramètres et char *argv[] est un tableau avec les paramètres réels étant passés dans votre application. De cette façon, vous pouvez travailler avec eux à l'intérieur de votre application.

0
répondu Ondrej Slinták 2010-10-09 21:59:59