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