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:
codice:
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;
}