Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - I problemi di un dilettante nel tentativo di emulare eMacs. :-D
Forum - C/C++ - I problemi di un dilettante nel tentativo di emulare eMacs. :-D

Avatar
Cluster (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/03/2011

Segnala al moderatore
Postato alle 16:15
Venerdì, 25/03/2011
Ciao a tutti!
Come potrete notare sono nuovo del forum.
Mi sono appassionato al C e, avendo già una buona padronanza di tutti i vari costrutti di questo linguaggio, ho provato a creare qualcosa di un po' più complicato (almeno per me).

Ho scritto un programma che memorizza in un vettore di 100 elementi (a breve ci sarà anche una versione con array ridimensionabili grazie all'ausilio di puntatori e allocazione di memoria. :-D) tutti i vari caratteri digitati dalla tastiera.

Il problema è che quando vado ad eseguire il secondo ciclo, ovvero quello che dovrebbe passare a trova_caratteri() ogni singolo elemento del vettore, mi parte un ciclo infinito e non ho ancora capito il perché.

Se scrivo la parola "ciao" il programma funzine benissimo, ma se scrivo parole più lunghe, non va.

Ho provato a fare anche tutte le varie prove per vedere se la funzione restituiva i valori giusti, se si inceppasse, ecc... Se gli passo un solo elemento alla volta, va tutto bene... appena provo a passarglieli con il ciclo for, parte il ciclo infinito.

Please, help me!!!!

Ecco il codice del programma in questione:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2.  
  3. char vocali[] = {'a', 'e', 'i', 'o', 'u', '\0'};
  4. char consonanti[] = {'b', 'c', 'd', 'f', 'g', 'h', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'z', '\0'};
  5. char numeri[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '\0'};
  6.  
  7. int trova_caratteri(char);
  8.  
  9. int i;
  10.  
  11. int main(void){    
  12.     char vettore[100], c;
  13.     int car = 0, spazi = 0, tab = 0, voc = 0, cons = 0, num = 0, div = 0;
  14.      
  15.     printf("Inserire testo: ");
  16.     while ((c = getchar()) != '\n')
  17.         vettore[i++] = c;
  18.     vettore[i] = '\0';
  19.    
  20.     for (i = 0; i < strlen(vettore); i++)
  21.         switch(trova_caratteri(vettore[i])){
  22.             case 0:
  23.                 spazi++;
  24.                 break;
  25.             case 1:
  26.                 tab++;
  27.                 break;
  28.             case 2:
  29.                 voc++, car++;
  30.                 break;
  31.             case 3:
  32.                 cons++, car++;
  33.                 break;
  34.             case 4:
  35.                 num++, car++;
  36.                 break;
  37.             case 5:
  38.                 div++, car++;
  39.                 break;                                
  40.             }
  41.            
  42.     system("cls");
  43.    
  44.     printf("Il testo digitato e': \n\n");
  45.     printf("%s", vettore);
  46.    
  47.     printf("\n\nNel testo digitato ci sono: \nCaratteri: %d\nSpazi: %d\nTabulazioni: %d\n"
  48.            "Consonanti: %d\nVocali: %d\nNumeri: %d\nAltri caratteri: %d\n\n", car, spazi, tab, cons, voc, num, div);
  49.    
  50.     system("pause");
  51.    
  52.     return 0;
  53.     }
  54.    
  55. int trova_caratteri(char a){
  56.     if (a == ' ')
  57.         return 0;
  58.     else if (a == '\t')
  59.         return 1;
  60.     else {    
  61.         for (i = 0; i < strlen(vocali); i++)
  62.             if (a == vocali[i])
  63.                 return 2;
  64.        
  65.         for (i = 0; i < strlen(consonanti); i++)
  66.             if (a == consonanti[i])
  67.                 return 3;
  68.  
  69.         for (i = 0; i < strlen(numeri); i++)
  70.             if (a == numeri[i])
  71.                 return 4;
  72.             }
  73.     return 5;
  74.     }



Grazie in anticipo per l'aiuto che eventualmente vorrete darmi.

P.S.=Complimenti per il forum e per il sito in generale. Sono molto utili per chi, come me, ha voglia di cominciare a programmare partendo da zero.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:55
Venerdì, 25/03/2011
Il problema è che usi la variabile globale int i come indice per tutti i cicli for del programma. Quando chiami la funzione trova_caratteri() quindi vai a "scricchiare" (termine tecnico) il contenuto del contatore "i" creando quindi un loop infinito.

Devi usare SEMPRE variabili locali, a maggior ragione se si tratta di indici di un loop.

PM Quote
Avatar
Cluster (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/03/2011

Segnala al moderatore
Postato alle 17:28
Venerdì, 25/03/2011
Ed ecco che viene fuori l'errore introvabile! :rotfl:

Grazie mille! Non ci sarei mai arrivato, perchè mi stavo concentrando troppo sul ciclo for.

Grazie ancora!!!

PM Quote