[Risolto]Conta vocali,consonanti e alfanumerici in file[C]

fk16
Ragazzi perchè questa parte di codice mi da segmentation fault? Come da titolo, devo contare quante vocali,consonanti e caratteri alfanumerici sono contenuti in un file....
void conta_vocali_consonanti_alfanumerici(FILE* file_ingresso, int* vet){
     char car;
     int i;
     for(i=0;i<3;i++)
        vet[i]=0;
     while((car = getc(file_ingresso)) != EOF) {
           if(car == 'a' || car == 'e' ||car == 'i' ||car == 'o' ||car == 'u')
                vet[0]++;
           else if(car == 'A' || car == 'E' ||car == 'I' ||car == 'O' ||car == 'U')
                vet[0]++;
           else if((car >= 00 && car <= 64) || (car >= 91 && car <= 96) || (car >= 123 && car <= 127))
                vet[1]++;
           else
                vet[2]++;
     }
}

Risposte
fk16
Ho risolto il problema del segmentation fault, però ora ho un altro problema! In pratica, il compilatore non entra nei vari cicli if e quindi il valore degli elementi del vettore è zero. Mi potete dare una mano.

fk16
Nessuno mi sa dare una mano?

giuscri
Hai provato ad inserire una stampa del vettore prima di uscire dalla funzione scritta sopra? Che succede? È il vettore che vorresti riuscire a stampare anche dal main() o è sempre vuoto?

fk16
Si ci ho provato ma risulta sempre vuoto. Secondo me, infatti, non entra nei vari cicli e non capisco il motivo.

giuscri
Se sei sicuro che stampando il vettore prima di uscire ti stampi sempre un vettore nullo, allora prova a vedere qual è il valore di car ad ogni estrazione, per esempio.

// ...
while((car = getc(file_ingresso)) != EOF)
  {
   if(car == 'a' || car == 'e' ||car == 'i' ||car == 'o' ||car == 'u') vet[0]++;
   // ...
   vet[1]++;
   else vet[2]++;

   printf ("DEBUG : \"car\" is now == %c \n", car)

  }
}
return;

fk16
L'ho fatto. Non mi entra nel ciclo while. Se metto la stringa che mi hi consigliato tu fuori dal ciclo while allora me la stampa, altirmenti no!

giuscri
"fk16":
L'ho fatto. Non mi entra nel ciclo while. Se metto la stringa che mi hi consigliato tu fuori dal ciclo while allora me la stampa, altirmenti no!


Be', almeno cominciamo a capire qualcosa.
Non è che il file risulta vuoto e l'EOF viene impostato subito?

Io proverei qualcosa del tipo:


// ...

// We're going to extract
// the first two char's:
int i;
for(i = 0; i < 2; ++i)
{
  char tmp_byte;
  tmp_byte = getc(file_ingresso);
  if(tmp_byte != EOF) printf ("\"tmp_byte\" == %c \n", tmp_byte);
  else printf ("Reached the end of file. \n");
}

while((car = getc(file_ingresso)) != EOF)
  {
   if(car == 'a' || car == 'e' ||car == 'i' ||car == 'o' ||car == 'u') vet[0]++;
   // ...
   vet[1]++;
   else vet[2]++;

   printf ("DEBUG : \"car\" is now == %c \n", car)

  }
}
return;



Cosa succede? Viene stampato "Reached the end of file"?

fk16
Hai centrato il bersaglio! Mi viene stampata quella stringa. Però, non capisco il perchè di questa cosa, il file che ho passato non è vuoto!

fk16
Sono riuscito a risolvere il problema! In partica oltre a questa funzione, ne avevo fatta un altra per stampare il contenuto del file di testo. Alla fine di quella funzione, il puntatore a FILE puntava all'ultimo elemento del file stesso (quindi EOF). Allora, mi è bastato usare rewind(nome_file) per far puntare al puntatore la prima parola del file.
Comunque ti ringrazio tantissimo dell'aiuto!

giuscri
"fk16":
Sono riuscito a risolvere il problema! In partica oltre a questa funzione, ne avevo fatta un altra per stampare il contenuto del file di testo. Alla fine di quella funzione, il puntatore a FILE puntava all'ultimo elemento del file stesso (quindi EOF). Allora, mi è bastato usare rewind(nome_file) per far puntare al puntatore la prima parola del file.


Ah, capisco!

Comunque ti ringrazio tantissimo dell'aiuto!


E' stato un piacere in realtà! :wink:

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.