PDA

Visualizza la versione completa : [C] Scanf "capricciosa"


giaomnitel1
15-11-2006, 18:24
Salve ragazzi, ho un problema a dir poco assurdo...la scanf in C mi da problemi se faccio una lettura di un carattere dopo aver fatto quella di un numero...esempio:

#include <stdio.h>
#include <stdlib.h>

main()
{
int numero;
char carattere;
printf("inserisci il numero->");
scanf("%d",&numero);
printf("inserisci il carattere->");
scanf("%c",&carattere);
system("pause");
}


Bene...mandando in esecuzione questo codice, accade che mi chiede il numero, lo inserisco, esegue la printf chiedendomi il carattere e va direttamente alla system("pause"), senza farmi inserire il carattere...insomma non esegue la scanf del carattere.
Se faccio fare la lettura del carattere prima di quella del numero tutto funziona...

In realtà ho trovato la soluzione, ovvero inserendo l'istruzione:
fflush(stdin);
prima della seconda printf, tutto funziona....ma mi domando PERCHE'?? è strana come cosa...può darsi che sia un problema noto, ma io è da poco che ho messo mani sul C, in passato ho lavorato solo in C++, dove la CIN non m'ha mai dato problemi del genere...

Ringrazio tutti!

oregon
15-11-2006, 18:29
E' un comportamento noto di queste funzioni dato il tipo di funzionamento bufferizzato.

Devi svuotare il buffer di input della tastiera.

Fai una ricerca sul forum ... e' un argomento trattato decine di volte ...

labrosan
16-11-2006, 01:49
Non è una cosa strana. Dopo aver inserito il numero premi INVIO, quindi inserisci un carattere che viene letto dalla successiva scanf. Per risolvere il problema basta aggiungere una scanf.

#include <stdio.h>
#include <stdlib.h>

main()
{
int numero;
char carattere;
printf("inserisci il numero->");
scanf("%d",&numero);
printf("inserisci il carattere->");

scanf("%c"); /* legge il cr */

scanf("%c",&carattere);
system("pause");
}

giaomnitel1
16-11-2006, 08:40
Mah..secondo me è un difetto...poichè se lo faccio come prima scanf, il carattere viene acquisito normalmente. Poi...posso fare 20 scanf consecutive di numeri (o anche stringhe) senza problemi...solo quando faccio una scanf di un carattere singolo e solo se lo faccio dopo altre scanf mi crea il problema...mah...comunque credo che sarò costretto a usare il

fflush(stdin);

oregon
16-11-2006, 08:50
Usa il fflush (anche se non e' standard) ma non e' un "difetto" ...

Alex'87
16-11-2006, 13:44
fflush(stdin) non standard? sei sicuro?

oregon
16-11-2006, 15:06
Non e' che non e' standard la fflush ma il fatto che venga usata sullo stdin

Visual C (e le sue librerie) lo implementano ma il suo comportamento, in realta', non e' definito e puo' non funzionare con altri compilatori.

Alex'87
16-11-2006, 18:19
Originariamente inviato da oregon
Non e' che non e' standard la fflush ma il fatto che venga usata sullo stdin

Visual C (e le sue librerie) lo implementano ma il suo comportamento, in realta', non e' definito e puo' non funzionare con altri compilatori.

ok tutto chiaro.. il mio vecchio libro di c fa un po' ca**are allora...

Loading