Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Domanda Semplice: Perchè mi conta un
Forum - C/C++ - Domanda Semplice: Perchè mi conta un "ciclo" in più?

Avatar
Adone (Normal User)
Newbie


Messaggi: 6
Iscritto: 20/08/2011

Segnala al moderatore
Postato alle 12:21
Venerdì, 02/09/2011
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++

  1. int main (int argc, char *argv[]){
  2.  
  3. int i=0;
  4. int counter=0;
  5. char s[L];
  6. char ch='a';
  7.  
  8. for(i=0;i<=L;i++){
  9.         s[i]=0;}
  10.  
  11. FILE *fp;
  12.  
  13. fp = fopen("testo.txt", "r");
  14.  
  15.  
  16. do{
  17.         fgets(s, L, fp);
  18.         printf("%s",s); // questo mi serve solo per vedere se sta fgettando giusto
  19.         for(i=0; i<=(strlen(s));i++){
  20.                 if(s[i]==ch)
  21.                         counter++;}
  22.         }
  23. while(feof(fp)==0);
  24.  
  25. printf("Il numero totale di a è: %d.\n", counter);
  26. }



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.

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Up
2
Down
V
Segnala al moderatore
Postato alle 12:26
Venerdì, 02/09/2011
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


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM