Programmi C con argomenti

Supponiamo di voler realizzare un programma C che utilizza degli argomenti, per fare un esempio un programma che saluta la persona il cui nome gli viene passato come argomento. Vogliamo quindi ottenere un eseguibile da richiamare nel seguente modo:

prompt> saluta Giovanni

dove "saluta" è il nome dell'eseguibile e "Giovanni" l'argomento. Il risultato sarà:

prompt> saluta Giovanni

ciao Giovanni
prompt>

Questo effetto non può essere ottenuto scrivendo un main del tipo:

main()
{
...
}

Tutti i programmi C che hanno argomenti devono avere un main definito nel seguente modo:

main(int argc, char **argv)
{
...
}

non importa quanti argomenti saranno passati al programma. Questo numero è catturato da argc. Il secondo argomento, argv, è un vettore di stringhe: argv[0] è il nome dell'eseguibile stesso, argv[1], argv[2], ... , argv[argc] sono gli argomenti. Poiché non sempre si desidera che gli argomenti siano delle stringhe, in certi casi occorrerà convertire le stringhe in valori di tipo diverso. Questa conversione può sempre essere eseguita con una chiamata a sscanf (il cui funzionamento è identico a fscanf solo che anziché leggere da file legge da stringa). Nel caso dei numeri interi esiste anche la funzione atoi che, data una stringa la traduce nel numero intero corrispondente. Controllare con il comando "man atoi" se occorre includere delle librerie particolari nei sorgenti che fanno uso di atoi.

Si noti che ad uno stesso programma possono essere passati numeri diversi di argomenti: il fatto che tale numero sia corretto e che gli argomenti siano del tipo atteso deve essere controllato da programma. Se, per esempio, sappiamo che il nostro programma ha bisogno di due argomenti, possiamo nserire nel codice le istruzioni:

if (argc<2) {
   printf("\n Utilizzo: mioProgramma file_input file_output\n");
   exit(0);
}

Come esercizio provare a compilare ed eseguire il seguente codice passondo al programma 0, 1, 2 o più argomenti di tipo diverso (stringhe, interi, numeri con virgola):


#include <stdio.h>

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

    printf("argc=%d\n",argc);
    for (i=0; i<argc; i++)
       printf("argv[%d]=%s\n",i,argv[i]);
}