Non usare fflush, usa invece questa funzione:
#include <stdio.h>
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
fflush(stdin)
dipende dall'implementazione, ma questa funzione funziona sempre. In C, è considerata cattiva pratica usare fflush(stdin)
.
Il comportamento di fflush
non è definito per i flussi di input (standard online 2011):
7.21.5.2 Ilfflush
funzione
Sinossi
1Descrizione#include <stdio.h> int fflush(FILE *stream);
2 Se il flusso punta a un flusso di output o a un flusso di aggiornamento in cui non è stata immessa l'operazione più recente, ilfflush
la funzione fa sì che tutti i dati non scritti per quel flusso da consegnare all'ambiente host vengano scritti nel file; in caso contrario, il comportamento è indefinito.
3 Sestream
è un puntatore nullo, ilfflush
La funzione esegue questa azione di scaricamento su tutti i flussi per i quali il comportamento è definito sopra.
Resi
4Ilfflush
La funzione imposta l'indicatore di errore per il flusso e restituisce EOF se si verifica un errore di scrittura, altrimenti restituisce zero.
Ho riscontrato lo stesso problema mentre lavoravo su LINUX e una soluzione alternativa a questo problema può essere la definizione di un carattere fittizio diciamo char dummy;
e inserisci un scanf()
per scansionarlo appena prima che avvenga l'effettivo input. Questo ha funzionato per me. Spero che funzioni anche per te.
Uno che funziona sempre su Linux:
#include <termios.h>
#include <unistd.h>
void clean_stdin()
{
int stdin_copy = dup(STDIN_FILENO);
/* remove garbage from stdin */
tcdrain(stdin_copy);
tcflush(stdin_copy, TCIFLUSH);
close(stdin_copy);
}
Puoi usare tcdrain e tcflush non solo per in/out/err fd.