Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24

    Programmazione C: FILE* e struct

    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
    codice:
    #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"); }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,327
    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.
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    24
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.