PDA

View Full Version : Piccolo problema di programmazione C/Unix


Gica78R
01-04-2005, 18:24
Ciao, spero di non sbagliare sezione del forum...

Sto realizzando (per l'esame di Sistemi Operativi) un server proxy http. Niente di eccezionale, comunque il problema non e' strettamente legato a questo.
Il problema e': come faccio a ripulire il buffer dello standard input dopo una lettura da tastiera?
Vi riporto la sezione di codice che mi da il problema:

do
{
printf("\nPROSEGUIRE UGUALMENTE (s/n)? ");
scanf("%c",&scelta);
}
while ((scelta!='s')&&(scelta!='n')&&(scelta!='S')&&(scelta!='N'));


In pratica, se inserisco un carattere diverso da 'n','N','s' o 'S', il ciclo viene ripetuto, ma poiche' nel buffer di input oltre al carattere letto rimane anche il CR/LF, il ciclo viene ripetuto due volte (e quindi la richiesta "PROSEGUIRE..." viene stampata due volte). La cosa non e' fondamentale, ma e' sicuramente antiestetica...
Ho provato con fflush(stdin), ma non cambia nulla. Con __fpurge(stdin) funziona, ma e' una funzione non standard che potrebbe causare problemi di portabilita'. La funzione fpurge(), invece, non e' supportata.

Sapreste aiutarmi?

Grazie,
Gica :cool:

AnonimoVeneziano
01-04-2005, 18:27
prova con :

while (getchar() != '\n') continue;


messo subito dopo la scanf ( o prima , vedi te a seconda di come è fatto il programma)

Ciao

Gica78R
01-04-2005, 18:30
Perfetto! Funziona :)

Grazie...

Ziosilvio
01-04-2005, 20:15
Originariamente inviato da Gica78R
do
{
printf("\nPROSEGUIRE UGUALMENTE (s/n)? ");
scanf("%c",&scelta);
}
while ((scelta!='s')&&(scelta!='n')&&(scelta!='S')&&(scelta!='N'));
Uhm... per leggere un carattere solo da standard input, al posto di scanf io avrei usato getchar...
In pratica, se inserisco un carattere diverso da 'n','N','s' o 'S', il ciclo viene ripetuto, ma poiche' nel buffer di input oltre al carattere letto rimane anche il CR/LF, il ciclo viene ripetuto due volte (e quindi la richiesta "PROSEGUIRE..." viene stampata due volte). La cosa non e' fondamentale, ma e' sicuramente antiestetica...
La cosa invece è abbastanza importante, e potrebbe dare origine a comportamenti imprevisti se applicata in un contesto più generale.
Suggerimento: leggi bene il K&R (o le man page di Linux) dove si parla di scanf, in particolare del valore restituito in output...
Ho provato con fflush(stdin), ma non cambia nulla.
Infatti il comportamento di fflush su uno stream di input non è definito dallo standard: ossia, come la soluzione suggerita dopo, anche fflush(stdin) non è standard.
Quella di AnonimoVeneziano funziona perfettamente, in realtà basterebbe addirittura:
while (getchar() != '\n')
;

ilsensine
01-04-2005, 21:29
Spostato in Programmazione

Gica78R
01-04-2005, 23:30
Giustamente funziona anche

while (getchar()!='\n') ;


Comunque seguiro' il tuo consiglio di riguardarmi la man page di scanf().

Grazie,
Gica :cool: