Argomenti della funzione main()

di il
4 risposte

Argomenti della funzione main()

Ho letto sia sul libro che su internet cosa sono e che fanno "argc", "argv", "envp" ma non sono riuscito a capirli nel senso pratico della programmazione.
Mi potreste fare degli esempi pratici sull'utilizzo (con mini-programmi) di queste 3 funzioni?? grazie.

4 Risposte

  • Re: Argomenti della funzione main()

    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;
  • Re: Argomenti della funzione main()

    Grazie mille per la spiegazione, comunque, se ho capito bene, questa è più una cosa concettuale che pratica quando programmo giusto?
  • Re: Argomenti della funzione main()

    Beh no, è una cosa pratica che viene spesso usata perché è comoda: è un modo semplice per passare degli argomenti ad un programma. Ad esempio se vuoi fare un programma che calcola il fattoriale puoi decidere di usare argc ed argv per ottenere il numero di cui si vuole calcolare il fattoriale, altrimenti devi affidarti a strumenti più tradizionali come la scanf oppure le GUI


    Sent from my iPhone using Tapatalk
  • Re: Argomenti della funzione main()

    maffo95 ha scritto:


    grazie mille per la spiegazione, comunque, se ho capito bene, questa è più una cosa concettuale che pratica quando programmo giusto?
    Quando esegui qualche programma che accetta i parametri nella linea di comando

    PROGRAMMA.EXE par1 par2 par3

    ti sei chiesto come vengono i parametri par1 par2 e par3 al PROGRAMMA.EXE per essere utilizzati?
Devi accedere o registrarti per scrivere nel forum
4 risposte