User Tools

Site Tools


it:informatica:linguaggio_c:argc_e_argv_1
Return to Home page

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

it:informatica:linguaggio_c:argc_e_argv_1 [2019/02/26 14:35] (current)
Line 1: Line 1:
 +====== 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:
 +<code bash>
 +C:> nome_prog.exe una_stringa_123
 +A_STRING_123
 +C:> nome_prog.exe -c 4 una_stringa_123
 +UNA_
 +</​code>​
 +
 +
 +**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. ​
 +
 +<file C 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;
 +}
 +</​file>​
 +
 +**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.
 +
 +<file C 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;
 +}
 +</​file>​

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?rev=1551188125&do=diff
/web/htdocs/www.skenz.it/home/data/pages/it/informatica/linguaggio_c/argc_e_argv_1.txt · Last modified: 2019/02/26 14:35 (external edit)

Privacy Policy