Perche' il getchar non mi attende l'inserimento di un carattere da tastiera, nonostante prima pulisca il buffer di tastiera?
Perche' il getchar non mi attende l'inserimento di un carattere da tastiera, nonostante prima pulisca il buffer di tastiera?
Se hai usato fflush(stdin), sappi che il comportamento di fflush sugli stream di input non è definito. fflush è fatta per operare sugli stream di output.Originariamente inviato da mr_bash
Perche' il getchar non mi attende l'inserimento di un carattere da tastiera, nonostante prima pulisca il buffer di tastiera?
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet
si, ho usato fflush(stdin)... che rimedio posso utilizzare?
help!!![]()
![]()
Non credo che la getchar abbia bisogno della pulitura del buffer.
In questo caso funziona:
Altrimenti usa il più consueto scanf("%c", &c);codice:int main() { char c; c=getchar(); printf ("\nInserito: %c\n\n", c); system("PAUSE"); }
Si, in quel caso funziona, pero' c'e' solo un' operazione di input....Originariamente inviato da devil89
Non credo che la getchar abbia bisogno della pulitura del buffer.
In questo caso funziona:
Altrimenti usa il più consueto scanf("%c", &c);codice:int main() { char c; c=getchar(); printf ("\nInserito: %c\n\n", c); system("PAUSE"); }
In un programma con vari input da tastiera la getchar funge in modo casuale...![]()
![]()
![]()
Questo thread mi ha incuriosito...in effetti avrei usato anche io la fflush per pulire lo stream di input. Però ha ragione Andbin...non funziona e non deve essere usato questo metodo.
Ho cercato allora una possibile soluzione su Google (sempre più incuriosito); e ho trovato nei gruppi un codice (l'ho provato su linux) che pone l'stdin in modalità non bufferizzata![]()
Il bello è che funziona. Se lo esegui il prg sta in attesa di un tasto e qualsiasi tasto inserisci te lo passa senza attendere il cr-lfcodice:#include <stdio.h> #include <termios.h> #include <sys/ioctl.h> main() { struct termios ts; struct termios new_ts; char c; int i; ioctl(0, TCGETS, &ts); new_ts = ts; new_ts.c_lflag &= !ICANON; new_ts.c_lflag &= !ECHO; ioctl(0, TCSETS, &new_ts); for( i = 0; i < 10; i++ ) { c=getchar(); printf("%c\n",c); }
Probabilmente non ti serve a nulla ma in fondo a qualcuno potrebbe interessare (ha me ha incuriosito...non mi ero mai posto il problema che la fflush stdin non funzionasse).
PS: allego il link di dove l'ho trovato link
Purtroppo utilizza delle librerie non standard, ed io, visto che e' un progetto per l'uni, non le posso utilizzare...Originariamente inviato da fastcoder
Questo thread mi ha incuriosito...in effetti avrei usato anche io la fflush per pulire lo stream di input. Però ha ragione Andbin...non funziona e non deve essere usato questo metodo.
Ho cercato allora una possibile soluzione su Google (sempre più incuriosito); e ho trovato nei gruppi un codice (l'ho provato su linux) che pone l'stdin in modalità non bufferizzata![]()
Il bello è che funziona. Se lo esegui il prg sta in attesa di un tasto e qualsiasi tasto inserisci te lo passa senza attendere il cr-lfcodice:#include <stdio.h> #include <termios.h> #include <sys/ioctl.h> main() { struct termios ts; struct termios new_ts; char c; int i; ioctl(0, TCGETS, &ts); new_ts = ts; new_ts.c_lflag &= !ICANON; new_ts.c_lflag &= !ECHO; ioctl(0, TCSETS, &new_ts); for( i = 0; i < 10; i++ ) { c=getchar(); printf("%c\n",c); }
Probabilmente non ti serve a nulla ma in fondo a qualcuno potrebbe interessare (ha me ha incuriosito...non mi ero mai posto il problema che la fflush stdin non funzionasse).
PS: allego il link di dove l'ho trovato link
Io ho provato con setbuf(stdin, NULL) e con setvbuf(stdin, NULL, _IONBF, 0) prima di ogni operazione di input, per non "bufferizzarle". Però anche in questo caso la getchar() a volte funge e altre volte no...
a me invece funziona questo codice qui:
(chiedo scusa a devil89 per aver preso il suo codice)codice:#include <stdio.h> #include <conio.h> int main() { char c; char v; c=getch(); printf ("\nInserito: %c\n\n", c); v=getch(); printf ("\nInserito: %c\n\n", v); v=getch(); printf ("\nInserito: %c\n\n", v); system("PAUSE"); return 0; }
saluti
![]()