Nepoužívejte fflush, místo toho použijte tuto funkci:
#include <stdio.h>
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
fflush(stdin)
závisí na implementaci, ale tato funkce vždy funguje. V C je považováno za špatnou praxi používat fflush(stdin)
.
Chování fflush
není definován pro vstupní toky (online standard 2011):
7.21.5.2fflush
funkce
Souhrn
1Popis#include <stdio.h> int fflush(FILE *stream);
2 Pokud tok ukazuje na výstupní tok nebo aktualizační tok, ve kterém nebyla zadána nejnovější operace,fflush
funkce způsobí, že všechna nezapsaná data pro tento proud, která mají být doručena do hostitelského prostředí, budou zapsána do souboru; jinak je chování nedefinováno.
3 Pokud jestream
je nulový ukazatel,fflush
Funkce provádí tuto akci proplachování na všech tocích, pro které je chování definováno výše.
Vrátí se
4fflush
funkce nastaví indikátor chyby pro proud a vrátí EOF, pokud dojde k chybě zápisu, jinak vrátí nulu.
Při práci na LINUXu jsem čelil stejnému problému a alternativním řešením tohoto problému může být, že definujete fiktivní znak, řekněme char dummy;
a vložte scanf()
naskenujte jej těsně předtím, než dojde k vašemu skutečnému zadání. Tohle mi fungovalo. Doufám, že to bude fungovat i vám.
Ten, který vždy funguje na Linuxu:
#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);
}
Můžete použít tcdrain a tcflush nejen pro in/out/err fd.
Přesunout soubory do adresářů na základě přípony
Jak zkontrolovat přístup k internetu pomocí bash skriptu v linuxu?