ho cambiato qualcosina (più per mio divertimento che altro)...
ho lasciato il limite dei 20 caratteri per non modificare eccessivamente il codice
comunque...ora va
codice:#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct a anag; struct a { char nome[21]; char cognome[21]; char eta[21]; struct a *next; }; anag *anagrafia(void); void stampa(FILE *f, anag *lista); int main(int argc, char **argv) { int i; char s; anag *p; anag *head; FILE *dest_file; if (argc != 2) { fprintf(stderr, "\n%s%s%s%s%s%s\n", "Errore di esecuzione: inseriti parametri ", "inesatti al lancio del programma.\nUtilizzo", "(il file di destinazione deve ", "gia' esistere):\n\n", argv[0], " <fileDiDestinazione>\n"); return 1; } else { if ((dest_file = fopen(argv[1], "w")) == NULL) { return 1; } printf("\nDigitare i dati del primo record:\n"); head = anagrafia(); p = head; } for (i = 1; i == 1; ) { printf("%s%s%s", "Digitare [s] per introdurre ", "un altro record, qualunque ", "altro tasto per terminare:\n"); /* * Il problema era verosimilmente :) "qui" * (riportando questo codice al tuo) * ...ora il primo getchar() assegna il carattere ad s, * il secondo prende '\n' */ s = getchar(); getchar(); switch (s) { case 's': case 'S': p->next = anagrafia(); p = p->next; break; default: i = 0; break; } } stampa(dest_file, head); fclose(dest_file); printf("Operazione giunta a buon fine. I record sono stati %s\"%s\".", "stampati sul file ", argv[1]); getchar(); return 0; } anag *anagrafia() { anag *nodo; char *buf; char c; int i; int chk; chk = i = 0; nodo = malloc(sizeof (anag)); buf = malloc(sizeof (char *)); printf("Inserire il nome (massimo 20 caratteri):\n"); while ((c = getchar())) { if (c != '\n' && i < 20){ *(buf + i) = c; } if (c == '\n') { *(buf + i) = '\0'; i = -1 ; chk += 1 ; if (chk == 1) { strcpy(nodo->nome, buf); printf("Inserire il cognome %s:\n", "(massimo 20 caratteri)"); } else if (chk == 2) { strcpy(nodo->cognome, buf); printf("Inserire l'eta' %s:\n", "(massimo 20 caratteri)"); } else if (chk == 3) { strcpy(nodo->eta, buf); nodo->next = NULL; break; } buf = realloc(NULL, sizeof (char *)); } ++i; } return nodo; } void stampa(FILE *f, anag *lista) { anag *p; p = lista; fprintf(f, "Elenco dei record memorizzati \n"); fprintf(f, "*******************\n"); while (p != NULL) { fprintf(f,"nome = %s\n", p->nome); fprintf(f,"cognome = %s\n", p->cognome); fprintf(f,"eta' = %s\n", p->eta); fprintf(f, "*******************\n"); p = p->next; } return; }![]()

)...

Rispondi quotando