Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Salve a tutti!
Vi pongo un'altra semplice domanda, a cui non trovo una risposta precisa.
La domanda riguarda sempre un algoritmo che conta il numero di occorrenze di una lettera in un testo. Il cuore dell'algoritmo è questo:
Codice sorgente - presumibilmente C++
int main (int argc, char*argv[]){
int i=0;
int counter=0;
char s[L];
char ch='a';
for(i=0;i<=L;i++){
s[i]=0;}
FILE*fp;
fp =fopen("testo.txt", "r");
do{
fgets(s, L, fp);
printf("%s",s);// questo mi serve solo per vedere se sta fgettando giusto
for(i=0; i<=(strlen(s));i++){
if(s[i]==ch)
counter++;}
}
while(feof(fp)==0);
printf("Il numero totale di a è: %d.\n", counter);
}
L'algoritmo funziona a meraviglia.
Tuttavia c'è un problema.
SE nel file testo.txt dopo l'ultima riga di testo c'è un "a capo", allora è come se il do-while facesse un giro in più e mi riconta un'altra volta l'ultima riga quindi ovviamnete il risultato viene sbagliato. Se io tolgo l'"a capo" finale dopo l'ultima riga, cioè se il cursore nel file testo.txt è posizionato subito dopo l'ultima parola dell'ultima riga allora il risultato viene perfetto. Come mai tutto ciò?
Il C è molto bello, ma mi "demoralizza" sempre per questi stupidi problemi che a volte mi fanno perdere delle ore quando il codice sembra perfetto.
fgets si ferma ad ogni carattere di andata a capo, quindi è normale che si comporti così... il C è un linguaggio arcaico, e se vuoi usarlo devi essere cosciente del fatto che avrai sempre mille problemi a trattare le stringhe.
Ciao, grazie per la risposta! Ma scusa, perchè è normale?! Lo so che si ferma ad ogni a capo, ma, perchè mi conta DUE volte l'ultima riga? Cioè se nell'ultima riga c'è scritto "ciao ciao" e io sto contando quante "c" ci sono, bè lui me ne segnerà 2 in più di quante sono. - Adone - 02/09/11 12:28
perchè l'ultima lettura la fa su una stringa vuota, lasciando inalterato il buffer della stringa precedente. - TheKaneB - 02/09/11 12:54
AH! Giusto! Sei un genio :D! Ora mi è chiaro! E se io faccessi fflush(stdin)?! - Adone - 02/09/11 13:07
... comporta un effetto indesiderato. Meglio un while( getchar() != '\n' ); - Pitagora - 02/09/11 13:39