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
Graziecodice:#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); }

 
			
			 
					
					
					
						 Rispondi quotando
  Rispondi quotando