Newsgroup: it.comp.os.linux.development
Titolo: Input da terminale: Linux è pazzo?

        Ho da poco tempo cominciato a programmare piccole cose sotto Linux
Mandrake 9.1. Stavo finalmente dedicandomi allo studio delle librerie
specifiche di Linux quando ho avuto un piccolo problema: non riesco a
leggere da terminale!
        Incredibile ma vero! Ho programmato sotto Windows tranquillamente,
ma, quando mi sono deciso a passare sotto Linux, invece di trovare
difficoltà in chissà cosa, l'ho trovata nelle semplici funzioni
"getchar()" e "scanf()". In poche parole, quando devo stampare una
richiesta di dato e leggere, faccio sempre così (da quando ho
cominciato a maneggiare il mio primo compilatore):
//
        printf("Inserisci un carattere: ");
        scanf("%c", &caratt);
oppure  caratt = getchar();
//
        La cosa bella è che prima non compare niente; dopo che ho premuto
INVIO, mi compare finalmente il prompt: è come se il programma
saltasse la printf(), andasse alla getchar(), poi tornasse alla
printf() e CONTINUASSE IL PROGRAMMA SENZA SVUOTARE IL CARATTERE LETTO
DA STDIN!!!!
        Se poi ci sono una serie di printf() e getchar() o scanf(), non vi
dico che casino! SI SCAMBIANO I DATI UNA DOPO L'ALTRA! Non riesco a
capire perchè una cosa così semplice (che ho sempre usato sotto
Windows con perfetta esecuzione) mi stia dando tutti questi problemi!
        E' come se mi stessi accingendo a scrivere la Divina Commedia e Linux
mi avesse tolto l'alfabeto!
        Ho provato ogni sorta di "fflush(stdin)" e "fflush(stdout)", ma la
lettura non funziona manco ammazzata!
        Prima che mi spari un colpo in testa o torni a Windows per
disperazione, qualche anima buona potrebbe aiutarmi?
        Grazie di tutto!
-- 
Giano BT

 ma la lettura non funziona manco ammazzata!
Cioe' questo
 printf("Inserisci un carattere: ");
 fflush(stdout);
 scanf("%c", &caratt);
non funziona?
Alessandro.

 Ho provato ogni sorta di "fflush(stdin)" e ..[cut]
Attento, fflush(stdin) non è definito.
Per la prima la questione è un po' piu complessa: se lasci il terminale
in forma canonica o cmq se non usi librerie che interagiscono col
terminale a basso livello (ncurses), l'input devi aspettartelo sempre
bufferizzato; questo vuol dire che ogni chiamata a getchar, scanf, etcc
etcc.. viene 'superata' solo dopo che l'utente ha anche premuto invio. Non
solo, tutto quello che l'utente ha digitato, ma che non era richiesto
dalla tua chiamata, rimane nel buffer dello stdin, e se non lo svuoti, il
suo contenuto ti verrà fornito alle successive chiamate dandoti
l'impressione che vengano saltate. Faccio un esempio per chiarire:
prova a compilare ed eseguire questo codice
<code>
        int i;
        char c;
        printf("inserisci una dozzina di caratteri\n");
        for(i=0;i < 10; i++ ) {
                scanf("%c", &c );
                putchar(c);
        }
	printf("\n");
</code>
come vedi ci sono dieci chiamate a scanf, ma se tu alla prima fornirai un
input piu lungo di 10 caratteri prima di premere invio, vedrai il tuo
programma bloccarsi soltanto per quella chiamata,e non per le successive 9
mi son spiegato di m*rda vero ?
Se non ti è chiaro posta che provo a esplicarmi meglio
Ciao
Matic
 

 dico che casino! SI SCAMBIANO I DATI UNA DOPO L'ALTRA! Non riesco a
credo tu ti stia dimenticando dei newline, sono caratteri anche
loro...
es:
$ cat a.c
int main(void){
char caratt;
	printf("Inserisci un carattere: ");
	scanf("%c", &caratt);
	printf("Il carattere letto e' %c\n", caratt);
	printf("Ora un altro carattere: ");
	caratt = getchar();
	printf("questo invece e' %c\n", caratt);
	printf("Dai, ancora uno: ");
	caratt = getchar();
	printf("questo infine e' %c\n", caratt);
	return 0;
}
$ gcc a.c
$ a.out 
Inserisci un carattere: a
Il carattere letto e' a
Ora un altro carattere: questo invece e' 
Dai, ancora uno: b
questo infine e' b
-- 
There are only 10 kinds of people in the world --
Those who understand binary, and those who don't.

Forte la signature! E' tua?
Mat

 [/CUT]
una stra-faq:
http://www.erlenstar.demon.co.uk/unix/faq_4.html#SEC49