PDA

Visualizza la versione completa : [C]Switch...ovviare l'errore di input e miglioramenti


Zanzy
11-04-2010, 17:57
Stavo provando e salvando l'istruzione switch per un eventuale uso futuro....la variabile dalla quale dipende lo switch è "scelta" dichiarata int.
In caso di inserimento di un altro numero oltre quelli che comportano i vari casi dello switch il ciclo while viene ripetuto ma nel caso di inserimento un carattere il programma va in loop...come potrei ovviare il tutto?
Inoltre avete consigli in generale?





#include<stdio.h>
main()
{
int scelta;
//il ciclo è sempre vero infatti si basa sulla condizione del while(1)che è sempre vera
//mentre solo nel caso 0 lo switch ritorna 0 alla do while
do{

printf("digita 1 se vuoi visualizzare la scritta 'prova del primo caso'\n");
printf("digita 2 se vuoi visualizzare la scritta 'prova del secondo caso'\n");
printf("digita 3 se vuoi visualizzare la scritta 'prova del terzo caso'\n");
printf("digita 0 se vuoi uscire\n");
//variabile sulla quale si basa lo switch se era un carattere nei vari casi bisogna
//mettere le virgolette ad esempio case"s"
scanf("%d",&scelta);

switch(scelta){
case 1:
{
printf("hai scelto il PRIMO caso\n");
}
break;
//l'istruzione break serve per concludere un caso
case 2:
{
printf("hai scelto il SECONDO caso\n");
}
break;
case 3:
{
printf("hai scelto il TERZO caso\n");
}
case 0:
{
return 0;
}
break;
default:
{
printf("errore di inserimento\n\n");
}
break;
}
}
while(1);

system("pause");
}

MItaly
11-04-2010, 18:14
scanf restituisce il numero dei campi correttamente letti e convertiti, per cui se viene inserito un carattere invece di un numero restituirà zero nel tuo caso, e in base a questo fatto si può individuare e rimediare alla condizione di errore. Il loop avviene perché scanf non riuscendo a convertire il carattere in un intero lo lascia nel buffer, e poiché questo non viene mai svuotato, il ciclo viene ripetuto all'infinito. Si rimedia facilmente:


if(scanf("%d",&scelta)!=1)
{
/* Svuota il buffer dai caratteri non validi leggendo finché non trova il ritorno a capo */
while(getchar()!='\n')
;
/* Imposta scelta a un valore "impossibile", così che nello switch venga stampato "errore di inserimento"
nota che se non venisse impostato a qualcosa resterebbe impostato sull'ultimo valore inserito,
per cui potrebbe essere eseguita un'azione dello switch indesiderata */
scelta=-1;
}

Zanzy
13-04-2010, 09:35
Grazie ;)

MItaly
13-04-2010, 15:11
:ciauz:

Loading