C - CONTATORE MAIUSCOLE E MINUSCOLE

di il
6 risposte

C - CONTATORE MAIUSCOLE E MINUSCOLE

Salve, come si può evincere dal titolo, sto riscontrando un problema nel seguente codice per contare le lettere maiuscole, minuscole e gli spazi. Il problema è che mi conta sempre un carattere in meno, per esempio, se la stringa è: "Sono UscIto molte volte in pochi MinUtI" l'ultimo carattere dell'ultima parola non viene conteggiato e sto letteralmente impazzendo. Di seguito il codice:
#include "stdio.h"
#include "stdlib.h"

int main(){
    char *stringa;
    int dim, i, maiuscole=0, minuscole=0, spazi=0;
    printf("Inserire dimensione stringa: ");
    scanf("%d",&dim);
    stringa=(char*)malloc(sizeof(char)*dim);
    while('\n'!=getchar());
    fgets(stringa,dim,stdin);
   for(i=0;i<dim+1;i++){
       if(stringa[i]>64 && stringa[i]<91){
           maiuscole++;
       }
       if(stringa[i]>96 && stringa[i]<123){
           minuscole++;
       }
       if(stringa[i]==32){
           spazi++;
       }
   }
   printf("\nMaiuscole=%d\nMinuscole=%d\nSpazi=%d\nA capo=%d",maiuscole,minuscole,spazi,a_capo);
}
Grazie mille in anticipo per l'aiuto.

6 Risposte

  • Re: C - CONTATORE MAIUSCOLE E MINUSCOLE

    Per la stringa devi prevedere un carattere finale per il terminatore.

    Quindi, dopo la fgets devi scrivere

    dim++;

    e il ciclo lo devi scrivere

    for (i = 0; i<dim; i++) {

    A parte questo, la variabile a_capo non esiste e non viene gestita.
  • Re: C - CONTATORE MAIUSCOLE E MINUSCOLE

    Ciao Oregon e grazie ancora per la risposta. Il codice presenta delle incongruenze "assurde" perchè avevo effettuato delle modifiche al codice "nativo" che avevo scritto per fare delle prove e per modificarlo prima di mandarlo non l'ho reso come in origine. Difatti, il codice che avrei dovuto proporre è questo:
    #include "stdio.h"
    #include "stdlib.h"
    
    int main(){
        char *stringa;
        int dim, i, maiuscole=0, minuscole=0, spazi=0;
        printf("Inserire dimensione stringa: ");
        scanf("%d",&dim);
        stringa=(char*)malloc(sizeof(char)*dim);
        while('\n'!=getchar());
        fgets(stringa,dim,stdin);
       for(i=0;i<dim;i++){
           if(stringa[i]>64 && stringa[i]<91){
               maiuscole++;
           }
           if(stringa[i]>96 && stringa[i]<123){
               minuscole++;
           }
           if(stringa[i]==32){
               spazi++;
           }
       }
       printf("\nMaiuscole=%d\nMinuscole=%d\nSpazi=%d\n",maiuscole,minuscole,spazi);
       for(i=0;i<dim;i++)
       printf("%c",stringa[i]);
    }
    In ogni caso, avevo pensato che il problema potesse essere scaturito dal carattere di newline, ma non avevo tenuto conto del carattere terminatore della stringa. Ho seguito comunque il tuo consiglio e dunque modificato il codice in questo modo:
    #include "stdio.h"
    #include "stdlib.h"
    
    int main(){
        char *stringa;
        int dim, i, maiuscole=0, minuscole=0, spazi=0;
        printf("Inserire dimensione stringa: ");
        scanf("%d",&dim);
        stringa=(char*)malloc(sizeof(char)*dim);
        while('\n'!=getchar());
        fgets(stringa,dim,stdin);
        dim++;
       for(i=0;i<dim;i++){
           if(stringa[i]>64 && stringa[i]<91){
               maiuscole++;
           }
           if(stringa[i]>96 && stringa[i]<123){
               minuscole++;
           }
           if(stringa[i]==32){
               spazi++;
           }
       }
       printf("\nMaiuscole=%d\nMinuscole=%d\nSpazi=%d\n",maiuscole,minuscole,spazi);
       for(i=0;i<dim;i++)
       printf("%c",stringa[i]);
    }
    ma continua a mangiare l'ultima parola, di qualsiasi "natura" essa sia.
  • Re: C - CONTATORE MAIUSCOLE E MINUSCOLE

    Scusa ho scritto 'dopo la fgets' ma intendevo 'dopo la scanf'
  • Re: C - CONTATORE MAIUSCOLE E MINUSCOLE

    Ok, così come mi hai detto è perfettamente funzionante e ti ringrazio. Ora vorrei però chiederti una delucidazione al riguardo, altrimenti ho solo svolto il compitino e mi ritroverei a non aver capito tutto nella fattispecie. Dal momento in cui inserisco la dimensione dell'array da tastiera, mettiamo caso che io inserisca come valore "9", nella mia variabile intera "dim" verrà salvato 9. Adesso, dal momento in cui vado ad allocare dinamicamente la memoria del vettore tramite la funzione
    stringa=(char*)malloc(sizeof(char)*dim);
    , sto assegnando 9 "celle" al vettore e dunque la dimensione del vettore va da
    stringa[0].........stringa[8]
    oppure sto assegnando il numero effettivo di caratteri massimo che il vettore può contenere (dunque 9 caratteri effettivi compreso il terminatore)? Spero di non aver generato confusione e soprattutto ti chiedo scusa se abuso del tuo tempo.
  • Re: C - CONTATORE MAIUSCOLE E MINUSCOLE

    Se dim vale 9 allochi 9 celle da 0 a 8 in cui è previsto lo spazio per 8 caratteri+terminatore. Ecco perché ne conti uno in meno. Se aggiungi una dim++ le celle diventano 10 quindi i tuoi 9 caratteri+terminatore
  • Re: C - CONTATORE MAIUSCOLE E MINUSCOLE

    Perfetto, tutto risolto e soprattutto mi è tutto molto chiaro. Grazie mille per la disponibilità e buona giornata.
Devi accedere o registrarti per scrivere nel forum
6 risposte