2010-06-11 20 views
348

In molti C++ IDE e compilatori, quando genera la funzione principale per voi, sembra che questo:Che cosa significa int argc, char * argv []?

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

Quando ho codice C++, senza un IDE, solo con una riga di comando del compilatore, digito:

int main() 

senza parametri. Cosa significa questo ed è vitale per il mio programma?

+35

Se il programma ignora gli argomenti della riga di comando, allora ciò che scrivi va bene. Se il tuo programma ha bisogno di elaborare gli argomenti della riga di comando, allora l'IDE sta facendo bene. –

+17

Un suggerimento per gli hacker: prova a dichiarare 'int main (int argc, char * argv [], char * envp [])' e stampa l'ultimo argomento. ';)' – ulidtko

+4

@ulidtko non è positivo che tu stia insegnando ai neofiti di introdurre la vulnerabilità nei loro programmi;) –

risposta

476

argv e argc come gli argomenti della riga di comando vengono passati a main() in C e C++.

argc sarà il numero di stringhe indicato da argv. Questo sarà (in pratica) pari a 1 più il numero di argomenti, poiché praticamente tutte le implementazioni anteponteranno il nome del programma all'array.

Le variabili sono denominate argc (numero di argomenti) e argv (argomento vettore) per convenzione, ma possono avere qualsiasi identificatore valido: int main(int num_args, char** arg_strings) è ugualmente valido.

Possono anche essere omessi interamente, restituendo int main(), se non si intende elaborare gli argomenti della riga di comando.

Provate il seguente programma:

#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; 
    } 
} 

Esecuzione con uscita ./test a1 b2 c3 volontà

Have 4 arguments: 
./test 
a1 
b2 
c3 
+7

'argc' può essere 0, nel qual caso' argv' può essere NULL. È consentito dallo standard AFAIK. Non ho mai sentito parlare di un sistema che lo faccia in pratica, ma certamente potrebbe esistere e non violerebbe alcun standard. – Chuck

+63

@Chuck: Poiché "Il valore di' argv [argc] 'deve essere 0" (C++ 03 §3.6.1/2), 'argv' non può essere nullo. –

+0

@James: Oh, buon punto. Stavo pensando a C, che ha regole sottilmente diverse per 'main'. – Chuck

42

argc è il numero di argomenti viene passata nel vostro programma da linea di comando e argv è la gamma di argomenti.

è possibile scorrere gli argomenti conoscere il numero di loro come:

for(int i = 0; i < argc; i++) 
{ 
    // argv[i] is the argument at index i 
} 
7

I parametri per principale rappresentano i parametri della riga di comando forniti al programma quando è stato avviato. Il parametro argc rappresenta il numero di argomenti della riga di comando e char * argv [] è una matrice di stringhe (puntatori di caratteri) che rappresentano i singoli argomenti forniti sulla riga di comando.

+2

Argv [] ha sempre argv [arg] come puntatore nullo. e Argv [0] è sempre il (percorso completo)/executableName come una stringa nul terminata – user3629249

+2

@ user3629249: Non necessariamente; 'argv [0]' è qualunque cosa il programma che lancia il programma C lo ha dato come 'argv [0]'. Nel caso di Bash, è spesso (forse sempre) il percorso dell'eseguibile, ma Bash non è l'unico programma che esegue altri programmi. È permissorio, sebbene eccentrico, usare: 'char * args [] = {" cat ","/dev/null ","/etc/passwd ", 0}; execv ("/ bin/ls", args); '. Su molti sistemi, il valore visto dal programma come 'argv [0]' sarà 'cat', anche se l'eseguibile è'/bin/ls'. –

5

Il primo parametro è il numero di argomenti forniti e il secondo parametro è un elenco di stringhe che rappresentano tali argomenti.

+5

la prima voce in argv [0] è il nome del programma, non un argomento – user3629249

1

Entrambi

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

sono definizioni legali del punto di ingresso per un programma C o C++. Stroustrup: C++ Style and Technique FAQ descrive alcune delle varianti possibili o legali per la funzione principale.

+2

Potrebbe voler inserire void in ... 'int main()' ==> 'int main (void)' ... per compatibilità e leggibilità . Non so se tutte le versioni precedenti di C consentono alle funzioni void di avere una lista di parametri vuota nella dichiarazione. – dylnmc

+1

@dylnmc questo non fornisce alcun guadagno di leggibilità ed è esattamente equivalente in tutte le versioni C++. Solo in C questo ha una differenza, ma solo nelle dichiarazioni, non nella definizione. – Ruslan

+0

@Ruslan Spiacente, ho postato questo quando stavo imparando C, e potrei aver letto che nelle prime versioni di C è richiesto 'void'. Non citarlo su questo, e ora so che è un commento un po 'sciocco. Non può far male, però. – dylnmc

5

La funzione main può avere due parametri, argc e argv.argc è un parametro integer ed è il numero di argomenti passati al programma.

nome Il programma è sempre il primo argomento, così ci sarà almeno un argomento di un programma e il valore minimo di argc sarà uno. Ma se un programma ha esso stesso due argomenti il ​​valore di argc sarà tre.

Parametro argv indica una matrice di stringhe e si chiama "argomento vettoriale". È una matrice di stringhe unidimensionale di argomenti di funzione.

+1

sarà utile anche: http://crasseux.com/books/ctutorial/argc-and-argv.html – moshtagh

11

Supponiamo si esegue il programma in tal modo (usando sh sintassi):

myprog arg1 arg2 'arg 3' 

Se avete dichiarato il vostro principale, come int main(int argc, char *argv[]), poi (nella maggior parte degli ambienti), si chiamerà il tuo main() come se come:

p = { "myprog", "arg1", "arg2", "arg 3", NULL }; 
exit(main(4, p)); 

Tuttavia, se avete dichiarato il vostro principale int main(), sarà chiamato qualcosa come

exit(main()); 

e non si ottengono gli argomenti passati.

Due cose aggiuntive da notare:

  1. Queste sono le uniche due firme standard di mandato per main. Se una piattaforma specifica accetta argomenti aggiuntivi o un tipo di reso diverso, allora questa è un'estensione e non dovrebbe essere invocata in un programma portatile.
  2. *argv[] e **argv sono esattamente equivalenti, quindi è possibile scrivere int main(int argc, char *argv[]) come int main(int argc, char **argv).
+1

Se siamo tecnici, ['basic.start.main/2'] (https://timsong-cpp.github.io/cppwp/basic.start.main#2) consente esplicitamente versioni aggiuntive definite dall'implementazione di 'main()', a condizione che l'implementazione fornisca le due versioni predefinite. Quindi, non sono _esattamente_ non conformi. Il più comune è 'envp', che è così noto in C e C++ che [è letteralmente la primissima voce nella sezione J.5 (Estensioni comuni) dello standard C] (http://port70.net /~nsz/c/c11/n1570.html#J.5). –

+0

Grazie per la bella pedanteria di @Justin. Risposta aggiornata per essere più corretta. –

+0

@TobySpeight \t Cosa succede se argc <3 restituisce un errore? cosa potrebbe essere andato storto? – AVI

1
int main(); 

Si tratta di una semplice dichiarazione. Non può accettare alcun argomento da riga di comando.

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

Questa dichiarazione viene utilizzata quando il programma deve utilizzare gli argomenti della riga di comando. Quando viene eseguito come tale:

myprogram arg1 arg2 arg3 

argc, o numero di argomenti, verrà impostato su 4 (quattro argomenti), e argv, o vettori argomento, verrà popolato con puntatori di stringa a "myprogram", "arg1", "arg2" e "arg3". L'invocazione del programma (myprogram) è inclusa negli argomenti!

In alternativa, è possibile utilizzare:

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

Questo è anche valido.

V'è un altro parametro è possibile aggiungere:

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

Il parametro envp contiene anche le variabili d'ambiente. Ogni voce segue questo formato:

VARIABLENAME=VariableValue 

come questo:

SHELL=/bin/bash  

L'ambiente lista variabili è terminata da null.