Oddio,
lesame si avvicina (Lunedi)...il programma è una mailing list, inserisce gli utenti in un array di strutture che contengono i campi relativi ai vari utenti, si possono aggiungere, eliminare, visualizzare, salvare su file e leggere da file...compila ma dopo che effettuo l'inserimento degli utenti e gli dico di visualizzarli non me li visualizza correttamente come se non li avesse inseriti bene...sono disperato...cos'è che non funziona?!? è grave

codice:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define MAX 100

struct addr{
	char name[30];
	char street[40];
	char city[20];
	char state[3];
	unsigned long int zip;
}addr_list[MAX];			// Dichiara un vettore di MAX locazioni di tipo struct addr

void init_list(void);	// Inizializza l'array di strutture, non riceve alcun paramentro, non ritorna nulla
void enter(void);
void delete(void);
void list(void);
void load(void);
void save(void);
int menu_select(void);
int find_free(void);

int main(){
	
	char choice;

	init_list();	// Inizializza l'array di strutture	
	
	for(;;){
	
		choice = menu_select();	 // metti in choice la scelta effettuata: valore ritornato da menu_select()
	
		switch(choice){
			case 1: enter();
		     	     break;
			case 2: delete();
		             break;
			case 3: list();
		             break;
			case 4: save();
	   	             break;
			case 5: load();
		             break;
			case 6: exit(0);
		}
	}
	
	return 0;
}

/* La funzione init_list() inizializza l'array di strutture, non riceve alcun parametro e non restituisce nulla */

void init_list(void){
	
	register int t;
	
	for(t=0; t<MAX; ++t)
		addr_list[t].name[0] = '0';	// Se il primo carattere del nome è \0 la locazione è vuota
}

/* La funzione menu_select() legge la scelta dell'utente, non riceve alcun parametro, restituisce un intero */

int menu_select(void){
	
	char s[80];
	int c;

	printf("1: Inserire un nuovo utente\n");
	printf("2: Cancellare un untente\n");
	printf("3: Elenca gli utenti\n");
	printf("4: Salva il file\n");
	printf("5: Carica il file\n");
	printf("6: Termina il programma\n");

	do{
		printf("Scegliere un'opzione valida: ");
		gets(s);	// Metti l'opzione scelta nella stringa s
		c = atoi(s);	// Trasforma la stringa in un valore intero accettabile e lo mette in c
	}while(c<1 || c>6);	// Continua a chiedere di inserire una scelta finchè questa non è valida

	return c;		// Ritorna al main la scelta effettuata
}
 
/* La funzione enter() inserisce i nomi nell'array di strutture, non riceve alcun parametro, non restituisce nulla */

void enter(void){
	
	int slot;
	char s[80];
	
	slot = find_free();	// Metti dentro a slot il valore resituito da find_free(): prima locazione libera
	
	if(slot == -1){		// Se find_free() restituisce -1 l'array di strutture è completo
		printf("Elenco completo");
		return;		// Non inserisce nulla e ritona al chiamante
	}
	
	printf("Inserire il nome: ");
	gets(addr_list[slot].name);
	printf("Inserire la via: ");
	gets(addr_list[slot].street);
	printf("Inserire la città: ");
	gets(addr_list[slot].city);
	printf("Inserire la provincia: ");
	gets(addr_list[slot].state);
	printf("Inserire il CAP: ");
	gets(s);
	addr_list[slot].zip = strtoul(s, '\0', 10);
}

/* La funzione find_free() trova una struttura inutilizzata, non riceve alcun parametro e restituisce al chiamante 
   -1 se non ci sono più locazioni vuote all'interno dell'array o la prima locazione libera nell'array */

int find_free(void){
		
	register int t;
	
	/* Incrementa t finchè il primo carattere del campo name delle varie strutture dell'array contiene un 
	   valore (struttura non libera) e finchè t è minore di MAX (array pieno) */
	for(t=0; addr_list[t].name[0] && t<MAX; ++t)

	if(t == MAX)	return -1;	// Se l'array è pieno torna il valore -1 al chiamante
	return t;			// Se l'array non è completo ritorna al chiamante la prima locazione libera
}

/* La funzione delete() cancella un elemento dalla lista, non riceve alcun parametro e non restituisce nulla */

void delete(void){
	
	register int slot;
	char s[80];
	
	printf("Inserire il numero del record da eliminare: ");
	gets(s);
	slot = atoi(s);		// Trasforma la stringa in s in un valore intero  accettabile e lo mette in slot
	
	if(slot>=0 || slot<MAX)	// Se il valore di slot è valido (se appartiene ad una delle locazioni della lista)
		addr_list[slot].name[0] = '\0';	    // Rendi '\0' il primo carattere del campo name della struttura
}

/* La funzione list() visualizza l'elenco dei nominativi nella lista, non riceve alcun paramentro e non restituisce 
   nulla */

void list(void){
	
	register int t;
	
	for(t=0; t<MAX; ++t){
		/* Se il primo carattere del campo name della struttura corrente nell'array è diverso da '\0' */
		if(addr_list[t].name[0]){
			printf("%s\n", addr_list[t].name);
			printf("%s\n", addr_list[t].street);
			printf("%s\n", addr_list[t].city);
			printf("%s\n", addr_list[t].state);
			printf("%lu\n\n", addr_list[t].zip);
		}
	}
	printf("\n\n");
}

/* La funzione save() salva l'elenco degli utenti inseriti nella lista su un file, non riceve alcun parametro e non 
   restituisce nulla al chiamante */

void save(void){

	FILE *fp;	// Dichiaro un puntatore a file
	register int i;
	
	/* Prova ad aprire un file binario in modalità scrittura ed assegna il puntatore a tale file a fp, se non
	   riesce ad aprire il file allora avverti l'utente e torna al chiamante senza fare nulla */ 
	if((fp=fopen("maillist", "wb")) == NULL){
		printf("Impossibile aprire il file\n");
		return;			// Torna al chiamante senza fare nulla
	}

	for(i=0; i<MAX; i++)
		if(*addr_list[i].name) //Se il primo carattere del campo name della struttura corrente diverso da '\0'
			if(fwrite(&addr_list[i], sizeof(struct addr), 1,fp) !=1)   // Se non può scrivere sul file
				printf("Errore di scrittura dul file\n");

	fclose(fp);			// Chiudi il file
}

/* La funzione load() carica una mailing list precedentemente salvata su file, non riceve alcun parametro e non 
   restituisce nulla al chiamante */

void load(void){
	
	FILE *fp;			// Dichiaro un puntatore a file
	register int i;
	
	/* Prova ad aprire il file binario in modalità di lettura, se al puntatore fp viene assegnato il valore 
	   NULL fopen() non è riuscita ad aprire il file e viene dato un messaggio di errore e si torna al 
	   chiamante senza aver fatto nulla */ 
	if((fp=fopen("maillist", "rb")) == NULL){
		printf("Impossibile aprire il file\n");
		return;			// Torna al chiamante
	}

	init_list();			// Altrimenti inizializza il nuovo array di strutture

	for(i=0; i<MAX; i++)		// e carica i valori salvati sul file nella nuova lista inizializzata
		if(fread(&addr_list[i], sizeof(struct addr), 1, fp) != 1){
			if(feof(fp))
				break;
			printf("Errore di lettura dal file\n");
		}
	
	fclose(fp);
}
Grazie