2011-03-07 6 views
4

Si j'ai ceci:C++ - int main (int argc, char * argv [])

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

Dans le corps, vous pouvez parfois trouver des programmes utilisant argv[1]. Quand faut-il utiliser argv[1] sur argv[0]? Est-ce seulement quand nous voulons juste lire l'argument deuxième dans la ligne de commande?

Répondre

0

Oui, c'est la plupart du temps, argv[1] est le deuxième paramètre de ligne de commande. Le premier paramètre de ligne de commande est le nom du programme lui-même.

Sinon, pour éviter le désordre sémantique que cette réponse avait à l'origine, et les commentaires des autres, il peut être judicieux d'appeler argv [0] le paramètre zeroth, de sorte que argv[1] serait désormais la « première » de les valeurs fournies par l'utilisateur.

Dans tous les cas, cela provient de la famille de fonctions exec(), par ex. execl qui a l'usage:

int execl(const char *path, const char *arg0, ... /*, (char *)0 */); 

Dans le shell (Unix) lorsque vous tapez une commande, si nécessaire, le shell résout d'abord le nom de la commande (en utilisant $PATH) pour trouver le chemin absolu réel. Le chemin (absolu ou relatif) est fourni pour path et la commande telle que saisie à l'origine est fournie sous la forme arg0, pour finalement devenir argv[0] dans votre programme.

Le reste paramètres de ligne de commande de fin puis comme argv[1], etc.

+3

Huh? Je ne suis pas sûr de ce que votre définition de «argument» est ici, mais je pense que c'est le premier argument, pas le second ... – Mehrdad

+0

umm, oui, clarifié. – Alnitak

0

Réponse courte est oui, le tableau contient toutes les options passées dans le programme.

2

argv [0] est le chemin du programme, argv exécution [1] est le premier paramètre au programme

3

Supposons que votre C++ fichier exécutable est:

/home/user/program (ou C:\program.exe en windows)

si vous exécutez:

./home/user/program 1 2 (ou C:\program.exe 1 2 sous windows)

argv[0] = /home/user/program (C:\program.exe)
argv[1] = 1
argv[2] = 2

C'est parce que:

  • argv[0] est le chemin du fichier exécutable
  • argv[1] est le 1er argument de

Modifier:

Maintenant, je vois que argv[0] n'est pas nécessairement le chemin du fichier exécutable.
Lire la suite SO question: Is args[0] guaranteed to be the path of execution?

+1

Notez que si 'argc == 1' alors' argv [1] 'n'existe pas. 'argc' n'est pas le nombre d'arguments, c'est la taille de' argv' (1 de plus que le nombre d'arguments). –

+1

@Cris Lutz: Plutôt, si 'argc == 1' alors' argv [1] == 0'. §3.6.1/2 indique explicitement que 'argv [argc] == 0' –

+0

@David - Je ne savais pas réellement cela jusqu'à ce que je l'ai cherché pour la réponse de Mehrdad. Content de savoir que je n'allais pas m'en tirer avec ça. –

4

argv est un tableau de pointeurs, et chaque pointeur dans ce tableau stocke un argument de ligne de commande. Donc, argv[0] est le premier argument (c'est l'exécutable/programme lui-même), argv[1] est le deuxième argument, et ainsi de suite!

Le nombre total d'arguments est déterminé par argc.

+1

Pourquoi le -1: C'est exactement correct. argv [1] est le deuxième argument de la ligne de commande interprété par le shell. Et est le premier argument qui devrait être interprété par l'application. –

+0

@Downvoter: s'il vous plaît expliquer la raison de downvote? – Nawaz

+0

@Nawaz - Quelqu'un a probablement sauté avant de regarder. Avoir un upvote et être en paix en sachant que cette réponse vous a donné un gain net de 28 points de réputation. :) –

12

Par convention, argv[0] est le nom du programme en cours (ou chemin), et argv[1] par argv[argc - 1] sont les arguments de ligne de commande que l'utilisateur fournit.

Toutefois, cela n'a pas avoir pour être vrai - les programmes peuvent fonctions spécifiques du système d'exploitation pour contourner cette exigence, et cela arrive assez souvent que vous devriez être au courant. (Je ne sais pas s'il y a beaucoup que vous pouvez faire même si vous êtes au courant, mais ...)

Exemple:

gcc -O3 -o temp.o "My file.c" 

serait (devrait) produire les arguments suivants:

argc: 5 
argv: ["gcc", "-O3", "-o", "temp.o", "My file.c"] 

donc dire argv[0] serait se référer à gcc, pas à -O3.

+0

Eh bien, argv [0] ne doit pas être le vrai chemin de l'exécutable, mais argv [1] .. argv [argc-1] doivent être les arguments de la ligne de commande: -). –

+5

5.1.2.2.1 section 2 point 4: "Si la valeur de' argc' est supérieure à zéro, la chaîne pointée par 'argv [0]' représente le nom du programme, 'argv [0] [0]' doit être le caractère nul si le nom du programme n'est pas disponible depuis l'environnement hôte Si la valeur de 'argc' est supérieure à un, les chaînes pointées par' argv [1] 'à' argv [argc-1] 'représentent le paramètres du programme. " –

+0

@Chris: C'est ce que nous * espérons * être vrai, mais vous pouvez facilement prouver qu'il est faux sur Windows dans certaines situations. : \ – Mehrdad