Newsgroup: it.comp.lang.c
Titolo: Per qualcuno è semplice :-) :una scanf() strana

Se eseguite il seguente programmino cosi come è e funziona.Se invece
rimuovo la quarta scanf("%c",&c) funziona solo alla prima esecuzione
cioè il primo passaggio.Al secondo passaggio del ciclo while() salta
la printf("Inserire il nome del prodotto") e mostra sì la printf()
appena citata,ma non permette di inserire il nome del prodotto,e si
ferma a"acquistati?"permettendo di inserire il numero di colli
acquistati.Ho anche provato ad assegnare valori alla variabile c
senza utilizzare scanf() credendo che il problema fosse dato dal fatto
che rimaneva memorizzato in c un qlc valore tipo ritorno a capo o EOF
o nullo...Il prog funge se lascio la scanf() citata al suo posto,ma
perchè funziona?Perchè se levo quella scanf() apparentemente inutile
invece il prog mal-funziona nonostante per compilatore e linker sia
tutto senza errori ne' avvertimenti?
Vorrei capire perchè bisogna inserire quella scanf() in quel punto del
prog che viene usato solo per leggere il numero di colli.Se ne avete
la possibilita' provate e datemi una spiegazione,vi prego.:-)
Ho usato per le prove il Visual C++ pro ver.6 utilizzando un progetto
tipo win32 console application.
Ecco il sorgente:
----------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(){
	char c;
	int ihow_many,i,imore;
	imore = 1;
	while(imore == 1){
		printf("Inserire il nome del prodotto: ");
		if(scanf("%c",&c) != EOF){
			while(c != '\n'){
				printf("%c",c);
				scanf("%c",&c);
			}
			printf("\nAcquistati?");
			scanf("%d",&ihow_many);
			scanf("%c",&c);  /*QUI LA SCANF() INQUISITA*/
 
			for(i=1;i <= ihow_many;i++)
				printf("*");
			    printf("\n");
		}
		else imore=0;
	}
	return(0);
}
---------------------------------------------------------------------------------------------------------------------

Paolo (
fl...@chierinet.it
) wrote:
[ snip ]
: Vorrei capire perchè bisogna inserire quella scanf() in quel punto del
: prog che viene usato solo per leggere il numero di colli.
Perche' la scanf("%d", &ihow_many) "non consuma" il carattere '\n'.
Se tu non lo elimini con la scanf("%c", &c) incriminata, questo
viene letto dalla scanf("%c", &c) che sta subito dopo la 
printf("Inserire il nome del prodotto: "); 
Avendo letto un '\n', si esce subito dal secondo while... 
Puoi usare anche
scanf("%d%*c", &ihow_many);
al posto di
scanf("%d",&ihow_many);
scanf("%c",&c);
Il "%*c" indica di leggere un char e di scartarlo.
Ciao ciao
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)


Ciao e grazie

 }
--------------------------------------------------------------------------------
Il problema e' ben noto ed e' la maggiore sorgente di domande sui ng del C.
scanf non dovrebbe essere usato per user input perche' fa' cose diverse da
quelle che di norma ci si aspetta ed e' poco gestibile dal punto di vista della
trattazione dell'errore.
Nel tuo caso il return battuto per inserire la stringa rimane nel buffer e
necessita una lettura separata.
Usa invece fgets(...) seguito da sscanf(...).
fegts(...) ha il vantaggio addizionale di leggere '\n' se e' presente entro i
limiti di lettura. Ricordati di inserire del codice per la trattazione di dati
erronei.
Ciao Paolo
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own    

Paolo (
fl...@chierinet.it
) wrote:
[ snip ]
: E' quello che avevo pensato anche io.Ho quindi provato ad asseganre un
: numero a c subito dopo scanf("%d",&ihow_many) eliminando cosě la
: scanf("%c",&c)  tanto per vedere se cambiava qlc.Invece niente.
?
: In teoria con un numero assegnato avrebbe dovuto funzionare.O no?
?
: Anche perchč ho impostato un brek point poco dopo la scanf e ho letto
: i valori di scanfd("%c",&c)sia in un modo che nell'altro,ma il valore
: č sempre un ritorno a capo.
Certo che e' un '\n'....
: > 
: >Puoi usare anche
: >
: >scanf("%d%*c", &ihow_many);
: Si,infatti ma volevo capire perchč...
Quando tu inserisci un numero, e poi /premi invio/, 
trasmetti anche un carattere '\n', che non viene 
eliminato da scanf("%d",...), per cui devi leggerlo 
esplicitamente.


 prog che viene usato solo per leggere il numero di colli.
Perché dopo lo scanf precedente rimane un \n nel buffer ancora da
leggere mentre dopo la prima lettura lo elimini con il ciclo while(c !=
'\n'). Potresti anche semplicemente porre uno spazio prima del %c della
prima scanf.
EMG

erronei.
Ok!
Grazie :-)