User Tools

Site Tools


it:informatica:linguaggio_c:argc_e_argv_1
Return to Home page

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
/web/htdocs/www.skenz.it/home/data/pages/it/informatica/linguaggio_c/argc_e_argv_1.txt · Last modified: 2024/04/08 22:35 by 127.0.0.1

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