Ciao, di solito il main è definito come:
int main (int argc, char** argv)
Il secondo argomento è un puntatore ad un array di stringhe, le quali sono i parametri che passi quando esegui il programma, mentre argc ti dice quanto è lungo l'array
Ad esempio considera il programma:
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
printf("L'array e' lungo %d\n", argc);
for (i=0; i<argc; i++) {
printf("%s\n", argv[i]);
}
return 0;
}
Supponi ora di lanciarlo con il seguente comando (supponendo che il file si chiami main.out):
./main.out 3 lol "wasd and lol". L'output che ottieni è il seguente:
[guest] $ ./main.out 3 lol "wasd and lol" <-- è la riga con cui eseguo il programma
L'array e' lungo 4
main.out <-- 1° elemento
3 <-- 2° elemento
lol <-- ecc..
wasd and lol
Puoi notare che ogni parametro è interpretato come una stringa ed è separato da uno spazio. Se vuoi che più parole separate da spazio vengano interpretate come un solo parametro allora devi racchiuderle dentro dei doppi apici.
Se, invece, esegui il programma "normalmente", ovvero con
./main.out ottieni:
[guest] $ ./main.out <-- è la riga con cui eseguo il programma
L'array e' lungo 1
main.out <-- 1° elemento
In pratica puoi vedere che se argc > 0 (l'array argv ha almeno un elemento, e di solito è così), allora il primo elemento di argv (cioè argv[0]) è il nome del programma.
Per altre informazioni:
Considera invece il seguente programma:
#include <stdio.h>
int main(int argc, char **argv, char** envp)
{
char **env;
for (env = envp; *env != NULL; env++) {
printf("%s\n", *env);
}
return 0;
}
Come output otterrai una cosa simile a questa:
[guest] $ ./main.out
HOSTNAME=guest
TERM=xterm-256color
PATH=/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:.
PWD=/home/cg/root
Ovvero envp è un puntatore ad un array contenente le variabili d'ambiente. Considera comunque che questa versione con 3 parametri è system-dependent (se non sbaglio funziona sui sistemi UNIX, su windows non ti saprei dire). Ad esempio sui sistemi apple si può usare la versione
int main(int argc, char **argv, char **envp, char **apple);
Per ricordarti i nomi puoi fare queste associazioni:
- argc = argument count
- argv = argument vector
- envp = environment pointer
Inoltre, in base alle specifiche è garantito che argc è un numero >= 0, e che argv[argc] è NULL;