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;
}