PDA

View Full Version : [C]URGENTE


Algeroth
08-01-2006, 23:50
Ciao a tutti,
questo è un segmento di codice che in esecuzione se immetto un carattere va in loop.
Qualcuno può aiutarmi?
while(1){
printf("Inserire il numero di posti che si desidera prenotare(Massimo %d prenotazioni)\n", MAXPREN);
scanf("%d", &n);
if (n>0 && n<=10)
break;
:muro: :muro: :muro: }

andbin
09-01-2006, 08:17
Ciao a tutti,
questo è un segmento di codice che in esecuzione se immetto un carattere va in loop.
Qualcuno può aiutarmi?
while(1){
printf("Inserire il numero di posti che si desidera prenotare(Massimo %d prenotazioni)\n", MAXPREN);
scanf("%d", &n);
if (n>0 && n<=10)
break;
}
Una possibile soluzione è questa:
char buf[20];
int n;

while(1)
{
printf("Inserire il numero di posti che si desidera prenotare(Massimo %d prenotazioni)\n", MAXPREN);

if (fgets(buf, sizeof (buf), stdin) != NULL)
{
if (sscanf(buf, "%d", &n) == 1 && n>0 && n<=10)
break;
}
}

Ziosilvio
09-01-2006, 13:30
Ti sei appena scontrato con uno dei problemi di scanf: l'input deve essere del tipo preciso indicato dal primo argomento.
Il comportamento è questo: finché la sequenza di caratteri si accorda con il tipo dell'oggetto previsto, scanf continua a leggere; quando non lo è più, rimette a posto sullo standard input l'ultimo carattere e termina.
Te la puoi cavare ricordando che scanf restituisce un valore intero, pare al numero di sottostringhe convertite in oggetti: quindi, ad esempio, scanf("%d",&n) restituisce 1 se la sequenza di caratteri presente sullo standard input corrisponde a un intero, e 0 altrimenti.
Allora puoi fare in modo che, in caso di input errato, lo standard input venga ripulito: così:
for (;;) {
if (scanf("%d",&n)==1) break;
while (getchar() != '\n')
;
}
Già che ci sei, leggi bene la parte del tuo libro di testo relativa a scanf.

Gandalf_BD
09-01-2006, 13:36
scusa, ma ti è stato spiegato nel tuo post precedente sulla scanf!!! :mbe: :read:
:)