PDA

Visualizza la versione completa : Programmazione C: FILE* e struct


Hr90uB
09-01-2012, 19:48
Salve a tutti,
è la prima volta che scrivo su questo forum quindi se commetto delle irregolarità mi scuso in anticipo.
Volevo sapere come dovrei fare per creare una lista ricorsiva con inserimento in coda. Vi allego il listato perchè non riesco a trovare la soluzione. Premetto che nella funzione crea_lista l'array di stringhe viene letto regolarmente il problema però è nell'assegnazione e di conseguenza nella stampa. Mi sono reso conto che facendo una printf("%s,%d",head->word,head->dim) solo nel primo caso funziona poi il programma va in blocco. Ho pensato che potrebbe essere un errore che riguarda il caso base della ricorsione. Grazie in anticipo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct data *next;
typedef struct data {
char *word;
int dim;
next successivo;
}data;
data *crea_lista(char *[]);
void stampa_lista(data *);
int main(void)
{
data *first;
int i=0;
char buff[100],*word[100];
FILE *input;
input=fopen("file.txt","r");
while(fscanf(input,"%s",buff)>0)
{
word[i]=(char *)malloc(100*sizeof(char));
strcpy(word[i],buff);
i++;
}
first=crea_lista(word);
stampa_lista(first);
system("pause");
return 0;
}
data *crea_lista(char *s[])
{ data *head;
if(strcmp(s[0],"")==0)
return NULL;
else { head=malloc(sizeof(data));
strcpy(head->word,s[0]);
head->dim=strlen(head->word);
head->successivo=crea_lista(s+1); return head;
}
}
void stampa_lista(data *head) {
printf("***********************\n");
for(;head!=NULL;head=head->successivo)
{ printf("*Stringa: %s\n",head->word);
printf("*Dimensione: %d\n",head->dim);
}
printf("***********************\n"); }

YuYevon
09-01-2012, 20:36
Mi limito a segnalare gli errori più evidenti che fanno crashare il programma:

1) non hai alcuna garanzia che la i+1-esima stringa del tuo array di stringhe "word" sia "", pertanto la strcmp() nella funzione ricorsiva non è detto che restituisca 0 dopo aver processato "i" stringhe. La soluzione banale è copiare esplicitamente la stringa "" nell'i+1-esimo elemento dell'array subito dopo il ciclo (allocando lo spazio necessario);

2) nella funzione ricorsiva allochi dinamicamente spazio in memoria per i nodi ma non per i loro campi "word" che quindi risultano puntare ad aree di memoria "casuali", non allocate; questo può determinare un segmentation fault con la strcpy() successiva;

3) rivediti il ciclo di stampa della lista e preferibilmente sostituiscilo con un while che è più naturale in quel caso: cosa succede quando head punta all'ultimo elemento della lista? Ne stampi i campi, poi valuti se è nullo (falso) e prosegui con un'altra iterazione, ma essendo quello l'ultimo nodo il successivo sarà NULL e di conseguenza vai a dereferenziare un puntatore nullo.

Hr90uB
09-01-2012, 21:14
Grazie, avevo pensato anche io di aggiornare l'array word[i+1],che poi già nel while lo incrementa solo che non avevo allocato lo spazio necessario.Ora il programma funziona correttamente. Gentilissimo :)

Loading