Potresti chiedere come ulteriore parametro N quanti indirizzi si vogliono inserire ed allocare la memoria in conseguenza di questo, in questo modo il ciclo avrebbe solo N interazione e non dovresti chiedere se si desidera inserirne altri.
Oppure dovresti utilizzare realloc nel ciclo, questo manterrebbe la possibilità di inserire indirizzi finché l'utente dice stop ma non è il top dell'efficienza e bisogna riallocare con parsimonia (tipo ogni tot cicli).
Approccio 2
codice:
# define NEW_RECORDS 10
struct mail{
char indirizzo[30];
} *email = NULL;
int i=-1;
int n=0;
int allocazioni = 1;
char scelta[2];
email=(struct mail*)malloc(NEW_RECORDS*sizeof(struct mail)); //alloco inizialmente 10 posti
do {
i++;
if (i == allocazioni * NEW_RECORDS){
email=(struct mail*)realloc(((allocazioni ++) * NEW_RECORDS)*sizeof(struct mail)); // realloc è dispendiosa, alloco 10 nuovi record per volta
}
printf("\nInserisci il %d° indirizzo email: ",i+1);
scanf("%s", email[i].indirizzo);
printf("\nNuovo indirizzo?: ");
scanf("%s", scelta);
} while (strcmp(scelta,"s")==0);
for (n=0; n<=i; n++) {
printf("\nMail nr.%d: %s",n+1,email[n].indirizzo);
}
free (email);