Newsgroup: it.comp.lang.c
Titolo: Scanf(), Printf() r problemi con la stampa della domanda

Ho un piccolo problema relativo alla seguente funzione:
**************************************************************************************
void menuFunction(){
	char scelta;
	BOOL error=0;
	do{
		printf("Vuoi iniziare una nuova partita (y,n)? ");
		scanf("%c", &scelta);
		printf("\n");
		switch(scelta){
			case 'n':
			case 'N': printf("Esco.\n");
				  exit(0);
				  break;
			case 'y':
			case 'Y': break;
			default : printf("Inserito un carattere diverso da y e n. ");
				  error=1;
				  break;
		}
	}while(error==1);
}
**************************************************************************************
Il problema è che durante lo scanf() la prima volta la risposta viene
accettata e controllata, ma  dal secondo ciclo del while in poi,
ovviamente se scelta non è 'y' o 'n', tutto ciò che viene stampato
con printf viene stampato per 2 volte ripetute come per esempio:
**************************************************************************************
Vuoi iniziare una nuova partita (y,n)? d
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)? g
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)? g
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)? f
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)? h
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)? r
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
Inserito un carattere diverso da y e n. Vuoi iniziare una nuova partita
(y,n)?
**************************************************************************************
Come potete vedere lo scanf() viene ignorato una volta su due.
Se serve sappiate che compilo con gcc 3.3 e avvio su shell di linux.
Grazie a tutti

 Se serve sappiate che compilo con gcc 3.3 e avvio su shell di linux.
Non viene ignorato. Legge l'a-capo.
Prova a rispondere 'abc' al prompt e vedrai uno "sbruffo" di 4 messaggi 
(uno per ogni carattere letto, incluso l'a-capo).

Si ho visto, quindi cosa dovrei fare per evitare queste ripetizioni?
Non ho ben capito per quale motivo mi fauno scherzo simile...se
inserisco un valore dovrebbe passarlo allo switch una sola volta,
perchè ripete questo trattamento per altre volte? A-capo è
considerato un carattere?


Dato che leggi un carattere per volta, lui esegue il ciclo una volta per 
ogni carattere.
A-capo è un carattere. Per la precisione il carattere '\n' (nota: se 
apri il file di input in modalità binaria allora l'a-capo dipende dal 
sistema. Sotto unix è '\n', sotto OsX è '\r' e sotto windows sono due 
caratteri: "\r\n").

 Si ho visto, quindi cosa dovrei fare per evitare queste ripetizioni?
Un modo e'  di leggere con
  scanf("%c\n", &scelta);
Cioe'  leggi fino al newline incluso.
Giorgio

Non funziona. In pratica se gli do scanf("%c\n", &scelta) mi fa lo
scherzo di andare a capo all'infinito...