PDA

View Full Version : [c] con queste stringhe proprio non ci capiamo


Vecchia Spugna
19-01-2005, 14:09
Raga innanzitutto devo dire che col c sono abbastanza scarso, quindi non sorprendetevi se dico scemenza grosse quanto l'uccellino di del piero a striscia la notizia:sofico:

allora purtroppo la scuola mi impone di fare 1 progetto d'esame e di lavorare sotto linux(che dà 1 sacco di errori in in compilaizone, mannaggia).

Cmq il problema non è in compilazione, ma in esecuzione del programma.
Si tratta di 1 funz che prende 1 stringa da 1 file di testo e la ricopia su 1 altro, mettendoci tra () il numero di riga.
Il problema è che purtroppo il prog mi legge solo 3 caratteri, e poi inserisce un nouvo numero di riga, mentre va a capo solo quando lo fa il file di input.

ecco il codice della funzione incriminata:

void lines_elab (FILE *file_in, FILE *file_out)
{

int lineCount = 1;
char *stringa

while (!feof (file_in))
{
stringa = malloc((sizeof(char)) * strlen(stringa));
fgets(stringa, sizeof(stringa), file_in);
fprintf(file_out, "(%d) " , lineCount);
fprintf(file_out , "%s" , stringa);
lineCount++;
stringa[0] = '\0' ;
free(stringa);
}
}

fine! manca il codice x terminare la funzione se nn c'è + memoria, questo lo so.
il comando stringa[0] = '\0' mi è stato necessario perchè dove c'erano file in input che avevano un ritorno a capo come ultimo carattere mi veniva copiata tutta la stringa che precedeva il ritorno a capo, quando in realtà doveva essere 1 linea vuota (se mi correggete anche questo problema è cosa gradita).

ringraziando tutti e sperando di aver postato a dovere (è la 1 volte che posto in questa sezione) vi saluto

ilsensine
19-01-2005, 14:14
Vecchia Spugna bevi troppo :D

stringa = malloc((sizeof(char)) * strlen(stringa));

Orrore. Mi calcoli manualmente strlen(stringa) per cortesia?

fgets(stringa, sizeof(stringa), file_in);

sizeof(char *) == 4 su ia32 e 8 su ia64/x86_64 _sempre_, indipendentemente dallo spazio che hai allocato per la stringa. E' semplicemente il sizeof di un puntatore, non del contenuto!

Vecchia Spugna
19-01-2005, 15:08
Originariamente inviato da ilsensine


sizeof(char *) == 4 su ia32 e 8 su ia64/x86_64 _sempre_, indipendentemente dallo spazio che hai allocato per la stringa. E' semplicemente il sizeof di un puntatore, non del contenuto!


capito, ma cosa ci metto? se provo a metterci strlen(stringa) mi crea 1 file di dimensioni apocalittiche e va in loop infinito, anche se compila e nn da warning, se ci metto 1 numero intero il prog funzia

Originariamente inviato da ilsensine

Orrore. Mi calcoli manualmente strlen(stringa) per cortesia?



questo non l'ho capito, anzi, mi ha sempre funzionato. strlen restiruisce il numero di caratteri contenuti in stringa - 1 (car nullo)

beppegrillo
19-01-2005, 15:52
Come fai ad utilizzare strlen(stringa) considerando che stringa è semplicemente dichiarato come un array di caratteri, se pure fosse una stringa hai comunque sbagliato a posizionare l'istruzione che andava messa fuori il ciclo while.

AnonimoVeneziano
19-01-2005, 16:29
+ che altro come fai ad usare strlen() su un qualcosa che ancora non è una stringa , ma solo un puntatore a caratteri! Mettici un numero fisso che è il numero massimo di caratteri in una riga .

Ciao

ilsensine
19-01-2005, 16:42
Originariamente inviato da Vecchia Spugna
questo non l'ho capito, anzi, mi ha sempre funzionato. strlen restiruisce il numero di caratteri contenuti in stringa - 1 (car nullo)
Alla prima chiamata, quindi durante la prima iterazione del ciclo while, la variabile "stringa" non è inizializzata e quindi punta a una locazione di memoria a caso. Quindi se sei fortunato il programma ti va in crash e capisci subito l'errore; altrimenti ti restituisce un valore completamente casuale. Metti ad esempio
char *stringa = NULL;
nella dichiarazione della variabile, e vedrai il crash immediato.

In sintesi, devi utilizzare un buffer di dimensione massima da te scelta, e utilizzare quella dimensione massima in luogo della strlen e di sizeof. strlen è valido solo se la stringa è sia _allocata_ che _inizializzata_.

Vecchia Spugna
19-01-2005, 17:45
wow!

chiarissimo, grazie!!!:p