Argc e Argv (Esempio 1)
Concetti:
Passaggio di argomenti da linea di comando.
Testo:
Si scriva un programma C che riceve in ingresso sulla linea di comando una stringa. Il programma dovrà stampare su schermo il contenuto della stringa convertito in maiuscolo.
L'opzione -c <numero>
tra il nome del comando e la stringa da convertire comunicherà al programma di stampare solo i primi <numero>
caratteri della stringa.
Esempi:
C:> nome_prog.exe una_stringa_123 A_STRING_123 C:> nome_prog.exe -c 4 una_stringa_123 UNA_
Soluzioni:
Verranno fornite due soluzioni.
Soluzione 1:
Nella prima soluzione, meno complessa, non si effettua nessun controllo sui parametri passati da linea di comando. Si ipotizza perciò che l'utente usi il programma correttamente.
- argc_argv_1a.c
/* Implementare un programma in C che riceva da linea di comando una stringa. Il programma dovrà trasformare la stringa in lettere maiuscole e stamparla sullo schermo. L'opzione '-c <numero>' tra il nome del programma e la stringa permette di convertire in maiuscolo e stampare solo i primi <numero> caratteri della stringa. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define LUN 50 int main(int argc, char *argv[]) { int i; char s[LUN+1]; int lunghezza_stringa; /* Un esempio di esecuzione del programma e': nome_prog.exe -c 4 sTriNga le variabili *argv[] e argc conterranno i seguenti valori: argv[0]="nome_prog.exe" argv[1]="-c" argv[2]="4" argv[3]="sTriNga" argc=4 E l'output del programma sara': STRI */ if(argc==4){ /* Nel caso in cui l'utente abbia specificato l'opzione -c */ lunghezza_stringa = atoi(argv[2]); strncpy(s, argv[3], lunghezza_stringa); s[lunghezza_stringa] = '\0'; }else{ /* Nel caso in cui l'unico argomento sia <stringa> */ strcpy(s, argv[1]); lunghezza_stringa = strlen(s); } for(i=0; i<lunghezza_stringa; i++){ s[i] = toupper(s[i]); } printf("La stringa risultante e': %s\n", s); return 0; }
Soluzione 2:
Nella seconda soluzione, sono stati effettuati tutti i possibili controlli sugli argomenti passati dalla linea di comando. Sfortunatamente, ciò impatta negativamente sulla leggibilità del programma.
- argc_argv_1b.c
/* Implementare un programma in C che riceva da linea di comando una stringa. Il programma dovrà trasformare la stringa in lettere maiuscole e stamparla sullo schermo. L'opzione '-c <numero>' tra il nome del programma e la stringa permette di convertire in maiuscolo e stampare solo i primi <numero> caratteri della stringa. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define LUN 50 int main(int argc, char *argv[]) { int i; char s[LUN+1]; int lunghezza_stringa; /* Un esempio di esecuzione del programma e': nome_prog.exe -c 4 sTriNga le variabili *argv[] e argc conterranno i seguenti valori: argv[0]="nome_prog.exe" argv[1]="-c" argv[2]="4" argv[3]="sTriNga" argc=4 E l'output del programma sara': STRI */ /* Controllo sul numero di argomenti */ if(argc!=2 && argc!=4) { printf("Errore: il programma deve essere eseguito con i seguenti argomenti\n"); printf("%s (-c <numbero>)? <stringa>\n", argv[0]); exit(-1) ; /* Come il comando return 1; , ma con exit() il programma viene stoppato anche se exit() viene chiamata all'interno di una funzione */ } if(argc==4) { /* Nel caso in cui l'utente abbia specificato l'opzione -c */ /* Controllo se argv[1] contiene -c */ if(strcmp(argv[1], "-c")!=0){ printf("Errore, l'unica opzione possibile e' -c\n"); exit(-2); } /* Controllo se il secondo argomento e' un numero */ for(i=0; i<strlen(argv[2]); i++){ if(isdigit(argv[2][i])==0){ printf("Errore: l'argomento dell'opzione -c deve essere un numero\n"); exit(-3); } } lunghezza_stringa = atoi(argv[2]); /* lunghezza_stringa = atoi(argv[2]); puo' essere sostituita dal comando */ /* sscanf(argv[2], "%d", &lunghezza_stringa); */ printf("LUNGHEZZA STRINGA: %d\n", lunghezza_stringa); /* Controllo se il numero (cioe' la variabile lunghezza_stringa) e' positiva */ if(lunghezza_stringa < 0){ printf("Il numero dell'opzione -c deve essere positivo o uguale a 0\n"); exit(-4); } /* Se la stringa e' piu' piccola di lunghezza_stringa, assegna a lunghezza_stringa la lunghezza effettiva di <stringa> */ if (lunghezza_stringa > strlen(argv[3])) lunghezza_stringa = strlen(argv[3]); /* Controllo se la stringa contenuta in argv[3] puo' essere salvata in s */ if(strlen(argv[3])>LUN){ printf("Errore: <stringa> troppo lunga\n") ; exit(-5); } /* La stringa e' stata salvata nel vettore s (una soluzione migliore era l'utilizzo diretto di argv[3]) */ strncpy(s, argv[3], lunghezza_stringa); s[lunghezza_stringa] = '\0'; }else{ /* Nel caso in cui l'unico argomento sia <stringa> */ /* Controllo se la stringa contenuta in argv[3] puo' essere salvata in s */ if(strlen(argv[1])>LUN){ printf("Error: <stringa> troppo lunga\n") ; exit(-5) ; } /* Salvataggio della stringa in s */ strcpy(s, argv[1]); lunghezza_stringa = strlen(s); } for(i=0; i<lunghezza_stringa; i++){ if(!isprint(s[i])){ printf("La stringa non e' valida. Alcuni caratteri non sono stampabili\n"); exit(-6); } s[i] = toupper(s[i]); } printf("La stringa risultante e': %s\n", s); return 0; }
If you found any error, or if you want to partecipate to the editing of this wiki, please contact: admin [at] skenz.it
You can reuse, distribute or modify the content of this page, but you must cite in any document (or webpage) this url: https://www.skenz.it/it/informatica/linguaggio_c/argc_e_argv_1