Salve a tutti,
ho un problema con un esercizio;Il programma dovrebbe gestire una lista concatenata di persone tramite puntatore a struttura.Il mio problema è che una volta compilato ed avviato il programma ho problemi con la funzione fgets come se non venisse letta l'istruzione.Questo non mi succede con la funzione scanf. Riporto il codice:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define massimo 100
struct data{
int giorno;
char mese[massimo];
int anno;
};
struct ind {
char via[massimo];
int numero;
char interno[massimo];
char citta[massimo];
char prov[massimo];
};
struct persona {
char nome[massimo];
char cognome[massimo];
struct data data_nasc;
char comune_nasc[massimo];
struct ind indirizzo;
char telefono[massimo];
char parentela[massimo]; //CF capofamiglia, CG coniuge ecc.
struct persona *link; // punta alla persona seguente
};
struct persona* inser_persona(struct persona *l){
if (l==NULL){
l=(struct persona*)malloc(sizeof(struct persona));
printf("1)Inserisci il nome:");
scanf("%s",l->nome);
printf("\nInserisci il cognome:");
scanf("%s",l->cognome);
printf("inserisci la data di nascita\n\tgiorno: ");
scanf("%d", &l->data_nasc.giorno);
printf("\n\tmese: ");
scanf("%s",l->data_nasc.mese);
printf("\n\tanno: ");
scanf("%d", &l->data_nasc.anno);
printf("\ninserisci il comune di nascita : ");
scanf("%s",l->comune_nasc);
printf("\ninserisci l'indirizzo :\n\tvia: ");
fgets(l->indirizzo.via,massimo,stdin);
printf("\n\tnumero civico : ");
scanf("%d", &l->indirizzo.numero);
printf("\n\t interno : ");
scanf("%s",l->indirizzo.interno);
printf("\n\tcitta' : ");
scanf("%s",l->indirizzo.citta);
printf("\n\tprovincia : ");
fgets(l->indirizzo.prov,massimo,stdin);
printf("\n\tparentela: ");
fgets(l->parentela,massimo,stdin);
printf("\n\tnumero di telefono: ");
fgets(l->telefono,massimo,stdin);
l->link=NULL;
return l;
}
else{
struct persona *nuovo=(struct persona*)malloc(sizeof(struct persona));
printf("2)Inserisci il nome:");
scanf("%s", nuovo->nome);
printf("\nInserisci il cognome:");
scanf("%s", nuovo->cognome);
printf("inserisci la data di nascita\n\tgiorno: ");
scanf("%d", &nuovo->data_nasc.giorno);
printf("\n\tmese: ");
scanf("%s", nuovo->data_nasc.mese);
printf("\n\tanno: ");
scanf("%d", &nuovo->data_nasc.anno);
printf("\ninserisci il comune di nascita : ");
scanf("%s", nuovo->comune_nasc);
printf("\ninserisci l'indirizzo :\n\tvia: ");
scanf("%s", nuovo->indirizzo.via);
printf("\n\tnumero civico : ");
scanf("%d", &nuovo->indirizzo.numero);
printf("\n\t interno : ");
scanf("%s", nuovo->indirizzo.interno);
printf("\n\tcitta' : ");
scanf("%s", nuovo->indirizzo.citta);
printf("\n\tprovincia : ");
scanf("%s", nuovo->indirizzo.prov);
nuovo->link=l;
return nuovo;
}
}
void stampaLista(struct persona *l){
if(l==NULL)
printf("lista vuota\n");
else{
while(l!=NULL){
printf("%s",l->nome);
printf(" ");
printf("%s",l->cognome);
l=l->link;
}
}
}
int main(){
int scelta=1;
struct persona *anagraf;
anagraf=NULL;
while(scelta!=0){
printf("\t\t\tANAGRAFE\nPremi:\n\t0 per uscire dal programma\n\t1 per inserire una persona\n\t2 per stampare la lista\n");
scanf("%d", &scelta);
if(scelta==1){
anagraf=inser_persona(anagraf);
}
if(scelta==2)
stampaLista(anagraf);
printf("\n\n\n\n");
}
return 0;
}
grazie in anticipo