La programmazione andrebbe sempre fatta con modalità 'difensiva', cioè evitare assolutamente di scrivere codice che potrebbe portare guai. Se la funzione prevede un valore di ritorno, l'ultima istruzione prima della parentesi di chiusura dovrebbe essere appunto il return di qualcosa. Mettere un return dentro un ciclo for non è vietato, ma potresti trovarti con problemi se per caso il ciclo for non viene eseguito.
Hai messo 2 versioni della funzione 'chiocciola': la prima non funziona (ripete sempre 'ERRORE!...') perchè il ciclo for testa solo il primo carattere della stringa 'email', che se non è '@', passa nell'else dell'if e fa ritornare 0. Se scrivi un indirizzo tipo '@pippo.it', il ciclo for non viene eseguito e la funzione non ritorna niente, ovvero lascia la variabile 'ctrl' invariata, ovvero con un valore a caso, dato che non è inizializzata (adesso sono con Visual Studio 2012 in modalità debug ed il giro è quello, ctrl viene inizializzata a 0). La seconda funziona solo se la '@' c'è, perchè il ciclo for si ferma solo quando la trova, e se non c'è continua all'infinito (ovvero sino a quando i > MAXINT o email
non la fa fuori del vaso... Ho eseguito un paio di volte il programma e una volta l'indice i si è fermato a 3166, l'altra a 230 perchè evidentemente ha trovato un '@').
Per quanto riguarda la funzione void leggi_dato_stdin(char *destinazione, int n, FILE *stdin)
la dichiarazione è sbagliata: non devi mettere stdin (ed in genere i nomi delle variabili non si mettono).
void leggi_dato_stdin(char *, int , FILE *);
Poi nelle chiamate alla funzione devi mettere solo stdin:
leggi_dato_stdin(nuova->cognome,31, stdin);
leggi_dato_stdin(nuova->nome,31, stdin);
leggi_dato_stdin(nuova->email,31, stdin);
La funzione viene poi definita così:
void leggi_dato_stdin(char *destinazione, int n, FILE *flusso_io)
{
char ctrl;
char buffer[MAX];
fgets(buffer,n, flusso_io);
if(buffer[strlen(buffer)-1]=='\n') buffer[strlen(buffer)-1]='\0';
else while(fgetc(stdin)!='\n');
strcpy(destinazione,buffer);
}
Comunque ci sono molte ridondanze inutili:
- stdin non serve passarlo come parametro (a meno che tu non voglia usare la funzione per leggere da un altro stream, ma allora devi correggere la fgetc)
- il parametro n (dimensione massima del buffer) non serve, perché hai già definito la costante MAX
PS: che compilatore stai usando?