Soluzione a)
codice:
do
{
printf("\nr (unsigned int) vale: ");
scanf("%u",&r);
fflush(stdin);
printf("\nVuoi ripetere? S/N\n ");
scanf("%c",&m);
}
while(m!='N' && m !='n');
oppure
Soluzione b)
codice:
do
{
printf("\nr (unsigned int) vale: ");
scanf("%u",&r);
getchar();
printf("\nVuoi ripetere? S/N\n ");
scanf("%c",&m);
}
while(m!='N' && m !='n');
scanf non scarta il '\n' che immetti nel buffer di input quando hai inserito il numero, per cui "scanf("%c",&m)" piazzerà in m il carattere '\n'.
La prima soluzione "flusha" (scarica) il buffer di input che è rimasto dopo che scanf ne ha prelevato il numero,
esempio1 ('\n' indica che premi invio, '\t' è il tab) :
tu scrivi "12431 \t \n" questo va nel buffer di input
scanf prende 12431
ora il buffer contiene questa schifezza " \t \n"
fflush() la butta via.
esempio2
se scrivi "12431\n"
allora scanf preleva 12431
il buffer di input contiene "\n"
Soluzione: a) fflush() lo butta via.
b) getchar() che lo scarta.
La gestione dell'input in maniera robusta richiede di costruirsi
una piccola libreria con funzioni tipo
get_int(int* i, int maxlen)
che gestiscono anche il massimo numero di caratteri di cui un
numero può essere composto.
codice:
printf("dammi i:";
scanf("%3d",&i);
dammi i: 12000
codice:
printf("i = %d", i);
i = 120
quello che si vuole è che l'utente non inserisca più di 3 caratteri, non basta dire non inserire più di 3 caratteri, occorrono funzioni ad hoc, stesso discorso per i float e per le stringhe.