Newsgroup: it.comp.lang.c
Titolo: non capisco + nulla !!!

salve,
sto facendo un semplice esercizio ma ho un problema. Non riesco a far
leggere un carattere con la funzione scanf.
Mi spiego meglio. L'esercizio e' il seguente:
#include<stdio.h>
#include<conio.h>
int main () {
 clrscr();
 char pippo;
 int lato;
 printf("inserire il lato = ");
 scanf("%d", &lato);
 printf("\n\n");
 printf("inserire il carattere = ");
 scanf("%c", &pippo);
 printf("\n\n");
 getch();
 return 0;
}
Ebbene....controllando con lo step-watch noto che all'arrivo della
riga scanf("%c", &pippo); all'interno della variabile pippo viene
messo sempre \n e non un carattere....cioe' non mi compare la scritta
"inserire il carattere = " ma viene messo direttamente un \n dentro
pippo.
La cosa stranissima e' che se modifico il codice di sopra con questo :
#include<stdio.h>
#include<conio.h>
int main () {
 clrscr();
 char pippo;
// int lato;
// printf("inserire il lato = ");
// scanf("%d", &lato);
 printf("\n\n");
 printf("inserire il carattere = ");
 scanf("%c", &pippo);
 printf("\n\n");
 getch();
 return 0;
}
funziona. Bho' ma dove sbaglio ? Perche' questo secondo funziona e
quello sopra no ?
Come compilatore uso Borland Turbo C++ 3.0

leggere un carattere con la funzione scanf.
sto facendo un po' di prove ed ho notato una cosa. Se leggo prima
l'int e poi il char allora il programma non funziona e dentro la
variabile char mi ci mette un \n.
Se invece leggo prima il char e poi l'int allora il programma funziona
e dentro la variabile char mi ci mette effettivamente un carattere.
Come mai ?
Potete darmi delle spiegazioni ?

 leggere un carattere con la funzione scanf.
Prova magari ad usare fflush(stdin); prima di scanf() credo che risolverai
il problema... Salutoni a tutti Dave.

 wrote in message
news:uno07vsfcusrhlhj2...@4ax.com...


 il problema...
fflush() applicata sullo stdin ha un comportamento indefinito.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg



ti ringrazio Dave, ora funziona.
Potresti spiegarmi anche a cosa serve questa funzione fflush ?
Dall'help del turbo c++ non ci ho capito molto.
Grazie ancora !!!

corrisponde al tasto INVIO, cioe'  '\n'
ti ringrazio molto Paolo, sei stato chiarissimo.
A questo punto mi viene in mente anche un'altra soluzione
per risolvere il problema.
Pensate che vada bene oppure potrebbe avere qualche
"effetto collaterale" ?
#include<stdio.h>
#include<conio.h>
int main () {
 clrscr();
 int num;
 char car,trash;
 printf("inserire un numero = ");
 scanf("%d", &num);
 printf("\n\n");
 scanf("%c", &trash);
 printf("inserire un carattere = ");
 scanf("%c", &car);
 getch();
 return 0;
}

 Grazie ancora !!!
La funzione fflush() serve per pulire il buffer associato ad un flusso di dati
da eventuali caratteri residui da operazioni precedenti. Il nome simbolico
stdin indica lo standard input cioč la tastiera. In definitiva si svuota la
zona di memoria associata alla tastiera in modo da preparla per i nuovi dati in
ingresso. Fai attenzione perň che il tutto non č utilizzabile su tutti i
compilatori perchč se fai riferimento all' ISO fflush e` definito solo per
flussi d'uscita, ma con il turbo c nn dovresti avere problemi. Salutoni a tutti
Dave.

> ti ringrazio molto Paolo, sei stato chiarissimo.
:)))
Mi sembra vada bene: se proprio vogliamo essere pignoli, puoi renderla un
po' piu' efficiente accorpando le due scanf
scanf("%d", &num);
printf("\n\n");
scanf("%c", &trash);
in
scanf("%d%c", &num,&trash);
printf("\n\n");
ma, lo ripeto, anche la tua soluzione va benissimo!
C'e' anche una cosa che in generale si tende a non considerare: la variabile
trash, in realta', non serve a nulla: quando sono stati decisi gli standard
della scanf, e' stato introdotto il *, che sopprime l'assegnazione del dato
letto: quando scanf incontra qualcosa del tipo %*c, %*d, ..., legge il
valore (come se * non ci fosse), ma non lo assegna a nessuna variabile:
puoi quindi fare anche
scanf("%d%*c", &num);
senza dichiarare trash: il codice di INVIO e' letto ma non assegnato a
nessuna variabile; ovviamente la soluzione scanf("%d%c", &num); (senza *) e'
assolutamente sbagliata, in quanto cercherebbe una variabile cui assegnare
l'INVIO che non e' stata passata.
A presto
Paolo Bardella