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.


it:informatica:linguaggio_c:argc_e_argv_1 [2024/04/08 22:35] (current) – created - external edit 127.0.0.1
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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki
Privacy Policy