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.2fflushfunkce
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,fflushfunkce 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 jestreamje nulový ukazatel,fflushFunkce provádí tuto akci proplachování na všech tocích, pro které je chování definováno výše.
Vrátí se
4fflushfunkce 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?