Stampa_caratteri

di il
5 risposte

Stampa_caratteri

Salve,
sapreste per caso dirmi cosa c'è che non va in questo codice? Devo memorizzare dei dati da un file in una struttura dati, ma quando eseguo la printf mi stampa dei caratteri a casaccio..non riesco a capire dove sia l'errore..grazie!!
void apertura_file(){

char **N;
int j=0,i;
char str[4];
int nr=0;



FILE *fp=fopen("toto.txt","r");
if(fp==NULL){
    printf("Errore nella apertura del file\n");
    exit(1);
}

while(fgets(str,4,fp)!=NULL)
    nr++;


rewind(fp);
N = malloc(nr*sizeof(char *));

while(fgets(str,4,fp)!=NULL){

        N[j]=malloc((strlen(str))*sizeof(char));

    for(i=0;i<(strlen(str));i++)
        N[j][i]=str[i];

    j++;
}

for(i=0;i<nr;i++)
printf("%s",N[i]);

return;
}

5 Risposte

  • Re: Stampa_caratteri

    Di solito il problema è che la stringa che si stampa non è terminata. Se il tuo file di testo contiene delle righe con più di 4 caratteri potresti rischiare questa situazione; consiglio, nel leggere riga per riga, di caricare una stringa di dimensione "sicura", ad esempio 40 caratteri, e dopo aver letto con la fgets() terminarla, sempre per sicurezza, alla posizione [40-1].
    Se stampi il contenuto di str dopo aver chiamato la fgets() (puoi provare sia nel ciclo in cui conti le righe, sia nel ciclo in cui carichi la memoria) ti stampa tutto correttamente?
  • Re: Stampa_caratteri

    Devi prevedere il terminatore per le stringhe quando allochi lo spazio

    N[j]=malloc( (strlen(str)+1) * sizeof(char) );
  • Re: Stampa_caratteri

    Grazie ad entrambi..comunque sono riuscito a risolvere il problema con una semplice strdup(str)..in pratica è una funzione che mi alloca dinamicamente le colonne del vettore e poi mi riempie le colonne con i valori presenti in str..pazzesco!! <3
  • Re: Stampa_caratteri

    Non mi pare tanto pazzesco ... la strdup equivale a

    ptr2 = malloc(strlen(ptr1)+1);
    strcpy(ptr2,ptr1);
  • Re: Stampa_caratteri

    Pinox, mi permetto di consigliarti di verificare sempre che il valore di ritorno della malloc() non sia NULL, ovvero non ci siano stati problemi ad allocare lo spazio di memoria richiesto.
    Questo discorso vale anche per la strdup().
    Ti consiglierei di provare ad utilizzare un'unica area, allocata per nr*5 chars (5 perchè considero 4 caratteri buoni e un terminatore), dove, per capirci, la stringa i-esima la carichi a partire dalla locazione i*5.
    In questo modo fai un'unica malloc() all'inizio e puoi controllare facilmente se è andata a buon fine.
    Infine nel tuo programma manca la chiamata a free() per deallocare gli nr+1 buffer che hai allocato; se fai un'unica allocazione dovrai fare un'unica chiamata a free().
Devi accedere o registrarti per scrivere nel forum
5 risposte