|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
[C] Problema ciclo for dentro un ciclo while
Giorno,
sto facendo delle prove scrivendo un piccolo parser (niente di chè, solo escape di stringhe). Attualmente ho messo a punto un algoritmo semplice semplice che prevede tramite un while(!feof( fp )) la chiamata a varie funzioni, una delle quali è fgets. Ottenuta la stringa poi passo tutto a un'altra funzione che tramite un ciclo for così definito: Codice:
for( i=0; i<strlen( line ); i++ ) Qui sorge il problema. Se provo a stampare le varie stringhe ottengo tutto con successo, ma ahimè l'ultima linea mi viene stampata due volte. Qualcuno sà da cosa possa dipendere il problema? Di seguito posto il problema semplificato (per non complicare le cose): Codice:
// importo gli header necessari void cleanString( char *line, char *escapedLine ); int main() { // ... fp è argv[1] char line[500]; char *escapedLine; while( !feof( fp ) ) { fgets( line, sizeof( line ), fp ); // alloco la memoria escapedLine = malloc ( strlen( line ) + 1 ) * ( sizeof( char ) ) ); cleanString( line, escapedLine ); // printf("%s\n", escapedLine); free( escapedLine ); } return( EXIT_SUCCESS ); } void cleanString( char *line, char *escapedLine ) { unsigned int i; unsigned int a = 0; // counter per cleanLine for( i=0; i<strlen( line ); i++ ) { switch( line[i] ) { case ' ' : case '\t': case '\n': break; default: cleanLine[a] = line[i]; a++; break; } } return; } Supponendo di avere un file con semplici frasi come potrebbe essere: Giorno a tutti, oggi mi sento bene. Ottengo come risultato: Giornoatutti, oggimisento bene. bene. <-- ripetuto due volte! Grazie a tutti, buona notte. Ultima modifica di Y3PP4 : 10-08-2009 alle 21:37. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Imposta il primo carattere della stringa a '\0' prima di leggere con fgets(), visto che è un buffer statico, dovrebbe bastare.
ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Grazie mille per la risposta
![]() Il sistema funziona (mi stampa solo un'ultima riga bianca ma dato che non dovrò stamparlo ed è un carattere nullo non dovrei avere problemi col parser...) Come mai bisogna usare questo escape (o hack che dir si voglia) ? Io avevo esplicitamente detto: "mentre non incontri la fine del file -> leggi una riga -> leggi ogni carattere della riga -> se non è uno spazio mettilo da parte -> ritornami tutti i caratteri messi da parte -> stampa i caratteri ritornati" Esegue palesemente un ciclo in più (in cui mi pare di capire che la stringa rimane inalterata) di quello richiesto... inoltre perchè la stringa rimane immutata? non è dichiarata come static... chiedo scusa ma alla solita se è possibile vorrei chiarire il concetto ![]() Buona notte e mille grazie ancora! |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
effettua una prima fgets fuori dal while e posiziona la chiamata come ultima istruzione del while in modo da sincronizzare con feof la posizione sullo stream.
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Alternativamente, puoi fare come consiglia nuovoUtente86 ed ottenere lo stesso effetto. ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Anzitutto mille grazie ad entrambi per la risposta.
Mille grazie nuovoUtente86 per il suggerimento, adesso che me lo hai esposto, tra l'altro, sembra la soluzione ad hoc al problema, mi sarà molto utile : grazie mille! Quote:
soprattutto perchè dare il fine stringa al primo carattere prima dello fgets. Grazie mille (inoltre mi sono chiarito anche il fatto che feof "cattura" un eof settato da un'altra funzione e non lo setta da solo). Buona serata a tutti :-). |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Uh, un'ultima cosa che mi era sfuggita.
Io dealloco la memoria con free(fp)... se libero la memoria contenente la stringa come fà ancora a restare in memoria nel ciclo successivo? Solo una piccola curiosità ![]() Buona serata, ciao. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Perché la prendi da line e ce la ricopi dentro (la fgets() opera sulla line allocata staticamente, non sulla escapedString allocata dinamicamente).
![]() ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Jul 2009
Messaggi: 210
|
Quote:
![]() non ho parole: se mi scordo pure come funzionano gli algoritmi più semplici che scrivo pochi giorni prima, sarà meglio che ricorra ad una cura di fosforo. Il fatto (a mia giustificazione ![]() parser->getLine(...); Beh che dire, dopo questa "svista" sarà meglio che con il prossimo post possa recuperare credito nel forum ![]() Buona notte ![]() |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Lascia stare, non servono giustificazioni... c'è chi (io per primo) ha fatto e fa cose ben peggiori.
![]() ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:06.