PDA

Visualizza la versione completa : [C] getchar e schermata "che passa oltre"


Neptune
21-04-2010, 23:15
Salve a tutti, ho la seguente stringa per l'acquisizione di stringhe da tastiera (per una serie di motivi preferisco questa soluzione ad una semplice scanf):



while((c=getchar())!=EOF && c!='\n')


Il problema che questo codice, inserito in una scelta di un menu (ovvero un ciclo while che ripete uno switch finch la scelta non 0) mi fa stampare subito il menu invece di "rimanere in attesa" come la scanf.

Da cosa pu dipendere?

Vi ringrazio in anticipo,
Neptune.

oregon
21-04-2010, 23:17
Facci vedere tutto il codice ...

Neptune
21-04-2010, 23:51
Ho risolto con un fflush(stdin) chiedo venia :fagiano:

xnavigator
22-04-2010, 00:23
Originariamente inviato da Neptune
Ho risolto con un fflush(stdin) chiedo venia :fagiano:

a me solo quello alle volte nno funzioan..

oregon mi ha suggerito :
while(getchar()!='\n') {}

e ora mi funge

Neptune
22-04-2010, 00:33
Originariamente inviato da xnavigator
a me solo quello alle volte nno funzioan..

oregon mi ha suggerito :
while(getchar()!='\n') {}

e ora mi funge

Cio se gli inserisci le parentesi graffe anche solo vuote poi rimane in attesa? E dici che una versione pi funzionale dell'fflush()?

antotan
22-04-2010, 01:26
Evitate la fflush.

"In some implementations this causes the input buffer to be cleared, but this is not standard behavior"

Piuttosto usate



while(getchar()!='\n') {}


o



while( (c = getchar()) != EOF && c != '\n');




Cio se gli inserisci le parentesi graffe anche solo vuote poi rimane in attesa


quel ciclo, con il corpo vuoto, consuma i caratteri nel buffer di input (usando getchar) fino a che non incontra il carattere di newline, in modo che i successivi input non vengano saltati a causa del buffer sporco

xnavigator
22-04-2010, 02:09
Originariamente inviato da Neptune
Cio se gli inserisci le parentesi graffe anche solo vuote poi rimane in attesa? E dici che una versione pi funzionale dell'fflush()?

no :fagiano: per rimanere in attesa si usano ben altri comandi..

quello un ciclo che fa sempre la stessa cosa cio il getchar fino a quando il buffer non si ripulito

come fare



while(1) {
if (getchar()=='\n')
break;
}


giusto per farti capire cosa fa

oregon
22-04-2010, 09:49
oregon mi ha suggerito :
while(getchar()!='\n') {}

Veramente ho suggerito

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

ma la stessa cosa ...

Neptune
22-04-2010, 10:25
Originariamente inviato da oregon
Veramente ho suggerito

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

ma la stessa cosa ...

Ma io non la uso per svuotare i caratteri quel ciclo, lo uso proprio per leggerli in successione dalla tastiera finch uno non preme invio.
Il problema che prima di iniziare a leggere avrei bisogno di svuotare il buffer oppure leggo porcherie. Dite che mi conviene fare prima un ciclo a vuoto che svuoti il buffer?

xnavigator
22-04-2010, 10:47
Originariamente inviato da oregon
Veramente ho suggerito

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

ma la stessa cosa ...


vab non c'era bisogno di chiarirlo :mame:


ho messo le partentesi graffe vuote per rendere meglio l'idea

Loading