Cesaruz (Normal User)
Pro
Messaggi: 83
Iscritto: 25/10/2007
|
Ciao a tuttiHo un problema con la risposta che acquisisci dall'utente prima dello switch.Infatti lo switch fuziona solo con variabili intere quindi se l'utente mette un carattere il ciclo va in loop.Quindi vorrei fare un ciclo di controllo sulla scelta dell'utente.Come posso fare???
Grazie anticipatamente a tutti.
Ultima modifica effettuata da Cesaruz il 26/11/2008 alle 19:00 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Emm... il codice per favore?
|
|
Cesaruz (Normal User)
Pro
Messaggi: 83
Iscritto: 25/10/2007
|
do{
printf("\nCosa si vuole fare? \n");
printf("1-Prelevare del credito\n");
printf("2-Visualizzare saldo attivo\n");
printf("3-Movimenti effetuati\n");
printf("4-Chiudi\n");
printf("Inserire scelta--->");
scanf("%d",&risp);
switch(risp){
}while(risp!=4);
Questo è il codice...quindi se con la scanf acquisico un carattere il ciclo do/while va in loop.
Come posso fare??
Grazie anticipatamente.
|
|
gioser (Normal User)
Pro
Messaggi: 111
Iscritto: 03/10/2008
|
devi controllare il valore di ritorno della scanf.
Codice sorgente - presumibilmente C/C++ |
int risp;
do{
printf("\nCosa si vuole fare? \n");
printf("1-Prelevare del credito\n");
printf("2-Visualizzare saldo attivo\n");
printf("3-Movimenti effetuati\n");
printf("4-Chiudi\n");
printf("Inserire scelta--->");
if (0 == scanf("%d",&risp))
{
char buf[100];
gets(buf);
printf("errore, scelta non valida\n");
}
else
{
switch(risp)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
printf("esco\n");
break;
default:
printf("errore, scelta non valida\n");
break;
}
}
}while(risp!=4);
|
Ciao
Ultima modifica effettuata da gioser il 28/11/2008 alle 13:35 |
|
Cesaruz (Normal User)
Pro
Messaggi: 83
Iscritto: 25/10/2007
|
Grazie mille
|
|
Cesaruz (Normal User)
Pro
Messaggi: 83
Iscritto: 25/10/2007
|
grazie di nuovo funziona perfettamente..
Però non riesco a capire come fa funzionare...
potreste spiegarmelo??
Grazie anticipatamente
|
|
gioser (Normal User)
Pro
Messaggi: 111
Iscritto: 03/10/2008
|
la funzione scanf restituisce il numero di valori che ha letto correttamente.
la tua scanf si aspetta un numero intero.
quando qualcuno inserisce un carattere invece di un intero, la scanf restituisce che ha letto zero valori.
Ma la scanf NON RIMUOVE il carattere dal buffer dello standard input, per forzarne la rimozione, in questo esempio ho usato la gets(), che rimuove tutto fino al \n. (sicuramente si può fare di meglio che usare la dgets(), che nel caso l'utente introducesse + caratteri della dimensione del buffer prima del newline porterebbe a un buffer overflow...)
La morale è che bisogna controllare sempre i valori di ritorno delle funzioni e gestire tutte le situazioni.
ciao
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Anche se gets() sarebbe sconsigliata da usare... è a rischio di buffer overflow.
|
|
gioser (Normal User)
Pro
Messaggi: 111
Iscritto: 03/10/2008
|
Postato originariamente da pierotofy:
Anche se gets() sarebbe sconsigliata da usare... è a rischio di buffer overflow. |
yep, nell'ultimo post ho scritto anche questo...
visto che siamo in argomento, tu hai idea di un modo migliore di svuotare lo standard input?
sui programmini a riga di comando ti confesso che sono un po' arrugginito e mi è rimasta la curiosità di come si potrebbe fare.. Ultima modifica effettuata da gioser il 02/12/2008 alle 11:39 |
|