2010-10-09 19 views
63

Possibili duplicati:
What are the arguments to main() for?
What does int argc, char *argv[] mean?'main (int argc, char * argv [])'

Ogni programma sta iniziando con la definizione main(int argc, char *argv[]).

Non capisco cosa voglia dire. Sarei molto felice se qualcuno potesse spiegare perché usiamo questi argomenti se non li usiamo nel programma? Perché non solo: int main()?

Il nome del programma uno degli elementi di *argv[] e argc è il conteggio del numero di argomenti in *argv[]? Quali sono gli altri argomenti inviati a *argv[]? Come li mandiamo?

+1

Si noti che se non si intende utilizzare gli argomenti della riga di comando, è perfettamente consentito (e molto ragionevole) definire la funzione 'int main (void)' o 'int main()'. Il tipo di ritorno ('int') è obbligatorio in C99 o C11; a volte i compilatori ti lasciano omesso se non specifichi quale versione dello standard C aderisce al tuo codice. Vedi anche [Cosa dovrebbe 'main()' restituire in C e C++] (http://stackoverflow.com/questions/204476/). –

risposta

88

Gli argomenti argc e argv di main viene utilizzato come un modo per inviare argomenti per un programma, il modo forse più familiare è quello di utilizzare il buon terminale ol' in cui un utente può digitare cat file. Qui la parola cat è un programma che prende un file e lo invia all'output standard (stdout).

Il programma riceve il numero di argomenti argc e il vettore di argomenti a argv, in quanto precede, la arg ument c ount sarebbe due (I conteggi nome del programma come primo parametro) e il arg ument v ettore conterrà [cat, file, null]. Mentre l'ultimo elemento è un puntatore nullo.

Comunemente, si dovrebbe scrivere in questo modo:

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. 
} 

Se il programma non richiede alcun argomento, è altrettanto valida per scrivere un main -funzione nel modo seguente:

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

Nelle prime versioni del linguaggio C, non esisteva loprima del main, poiché ciò era implicito. Oggi, questo è considerato un errore.

Su POSIX sistemi -compliant (e Windows), esiste la possibilità di utilizzare un terzo parametro char **envp che contiene un vettore di programmi environment variables. Sono disponibili ulteriori varianti dell'elenco di argomenti della funzione main, ma non lo descriverò qui poiché non è standard.

Inoltre, la denominazione delle variabili è una convenzione e non ha alcun significato. E 'sempre una buona idea di aderire a questo in modo che non confondere gli altri, ma sarebbe ugualmente valido per definire main come

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

E riguarda la seconda domanda, ci sono diversi modi per inviare argomenti a una programma. Vorrei raccomandare a guardare la exec*()family of functions che è POSIX -standard, ma è probabilmente più facile usare solo system("command arg1 arg2"), ma l'uso di system() di solito è visto di buon occhio in quanto non è garantito il funzionamento su ogni sistema. Non l'ho provato da solo; ma se non c'è bash, zsh o altra shell installata su un sistema * NIX, system() avrà esito negativo.

+0

Se non ho sbagliato il valore minimo possibile di 'argc' è 1 e' argv [0] 'contiene la stringa'./Mymainprogram' mentre 'argv [1]' è 'NULL'. Le mie domande sono- ** 1: ** Qual è il valore massimo che 'argc' può contenere? ** 2: ** Quali sono queste stringhe che vengono aggiunte a 'argv [] '? – barnes

+1

@barnes - Il massimo dipende dal sistema operativo. In Win32 la riga di comando stessa ha un limite di lunghezza di 32K, quindi 'argc' ha un limite pratico di 16K. –

+1

Congratulazioni per la tua pietra miliare della reputazione 1k oggi! – wizzwizz4

0

argc è il numero di argomenti della riga di comando e argv è una matrice di stringhe che rappresentano gli argomenti della riga di comando.

Questo ti dà la possibilità di reagire agli argomenti passati al programma. Se non ti aspetti nessuno, potresti usare anche int main.

13

Con argc (argomento numero) e argv (vettore argomento) è possibile ottenere il numero ei valori degli argomenti passati quando l'applicazione è stata avviata.

In questo modo è possibile utilizzare parametri (ad esempio -version) all'avvio dell'applicazione in modo diverso.

Ma si può anche utilizzare int main(void) come prototipo nel C.

C'è un terzo (meno conosciuta e non standard) prototipo con un terzo argomento che è envp. Contiene variabili d'ambiente.


Risorse:

+0

Cosa c'entra il nome del programma con gli argomenti passati a main()? –

+1

@Potatoswatter, @You, ho aggiornato la mia risposta per dire esplicitamente che envp non è standard. @fahad, solitamente il primo argomento è il nome dell'applicazione, in questo modo puoi sapere come è stata chiamata la tua applicazione. –

+0

Solo per nome, come sapresti come è stato chiamato? –

3

argc si intende il numero di argomenti che vengono passati al programma. char* argv[] sono gli argomenti passati. argv[0] è sempre il nome del programma stesso. Non sono sicuro al 100%, ma penso che int main() sia valido in C/C++.

+0

'int main()' è valido solo in C++. In C devi inserire un vuoto in questo modo: 'int main (void)'. Anche lo stile C 'int main (void)' è valido in C++ sebbene il suo uso in C++ sia scoraggiato. – Ultimater

+0

@Ultimater Sono abbastanza sicuro che 'int main()' è valido anche in C. Dichiara una funzione varargs. – Navin

+0

@Navin Molti compilatori C++ sono molto indulgenti quando incontrano il codice C poiché C++ consente sia la compilazione di 'int main()' che di 'int main (void), ma un compilatore C, sicuramente un compilatore C precedente, non supporterebbe lo stile C++ 'int main()'. Ho seguito un corso su C/C++ che poneva una forte enfasi sulla portabilità, e se il tuo compito doveva essere scritto in C e gli hai dato una dichiarazione 'int main()', il suo controllore di assegnamento si sarebbe lamentato, senza nemmeno compilarlo e avremmo perso punti nel compito a meno che non lo avessimo ripresentato entro la scadenza. – Ultimater

39

Quelli sono per il passaggio di argomenti al vostro programma, per esempio da riga di comando, quando un programma viene richiamato

$ gcc mysort.c -o mysort 

$ mysort 2 8 9 1 4 5 

Sopra, il programma mysort viene eseguito con alcuni parametri della riga di comando.All'interno main(int argc, char * argv[]), questo comporterebbe

Argument Count, argc = 7 

poiché ci sono 7 argomenti (contando il programma), e

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

seguente è un esempio completo.

$ 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 

[I char stringhe "2", "8", ecc possono essere convertiti in numero utilizzando qualche personaggio funzione di conversione numero, ad esempio atol()(link)]

0

argc è il numero di riga di argomenti di comando dati al programma in fase di esecuzione, e argv è un array di array di caratteri (piuttosto, un array di C-stringhe) contenente questi argomenti. Se sai che non stai andando ad avere bisogno gli argomenti della riga di comando, è possibile dichiarare il vostro principale a prendere un argomento void, invece:

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

Questi sono gli unici due prototipi definiti per main secondo gli standard, ma alcuni compilatori consentono anche un tipo di ritorno di void. Maggiori informazioni su questo on Wikipedia.

+1

int main() {} è ok – Nikko

+0

Tecnicamente, 'int main()' è una funzione che accetta arbitrariamente molti argomenti, mentre 'int main (void)' prende esattamente zero argomenti, quindi il secondo è più corretto. – You

+2

no, in una * definizione *, 'int main()' è una funzione che non accetta parametri. In una * dichiarazione * che non è una definizione, è una funzione che assume parametri non specificati. Questo è 6.7.5.3/14 in n1256 o 6.5.5.3/10 in n794.L'interrogante sta chiedendo una definizione. –

0

È possibile eseguire l'applicazione con parametri come app -something -somethingelse. int argc rappresenta il numero di questi parametri e char *argv[] è una matrice con i parametri effettivi passati nell'applicazione. In questo modo puoi lavorare con loro all'interno della tua applicazione.

1

Il comp.lang.c FAQ occupa la domanda

"What's the correct declaration of main()?"
in Question 11.12a.

+2

... ma questo non è comp.lang.c, è StackOverflow, una comunità in cui * aiutiamo * le persone * rispondendo * alle loro domande, non reindirizzandole a manuali, domande frequenti o collegamenti lmgtfy. –

+1

La domanda aveva già una risposta sopra. Le domande frequenti su C, tuttavia, meritano comunque di essere lette. Ma afferma nella sua licenza che non può essere riprodotto senza permesso. Pertanto i collegamenti. Solo per completezza. – cschol