Verwenden Sie nicht fflush, verwenden Sie stattdessen diese Funktion:
#include <stdio.h>
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
fflush(stdin)
hängt von der Implementierung ab, aber diese Funktion funktioniert immer. In C gilt es als schlechte Praxis, fflush(stdin)
zu verwenden .
Das Verhalten von fflush
ist nicht für Eingabeströme definiert (Online-2011-Standard):
7.21.5.2 Diefflush
Funktion
Zusammenfassung
1Beschreibung#include <stdio.h> int fflush(FILE *stream);
2 Wenn stream auf einen Ausgabestream oder einen Aktualisierungsstream zeigt, in den die letzte Operation nicht eingegeben wurde, wird derfflush
Die Funktion bewirkt, dass alle ungeschriebenen Daten für diesen Stream, die an die Hostumgebung geliefert werden sollen, in die Datei geschrieben werden; andernfalls ist das Verhalten undefiniert.
3 Wennstream
ist ein Nullzeiger, derfflush
Die Funktion führt diese Spülaktion für alle Streams aus, für die das Verhalten oben definiert ist.
Rückgaben
4Diefflush
Die Funktion setzt den Fehlerindikator für den Stream und gibt EOF zurück, wenn ein Schreibfehler auftritt, andernfalls gibt sie Null zurück.
Ich hatte das gleiche Problem, als ich unter LINUX arbeitete, und eine alternative Lösung dieses Problems kann darin bestehen, dass Sie ein Dummy-Zeichen definieren, sagen wir char dummy;
und geben Sie scanf()
ein um es zu scannen, kurz bevor Ihre eigentliche Eingabe stattfindet. Das hat bei mir funktioniert. Ich hoffe, es würde auch für Sie funktionieren.
Eine, die unter Linux immer funktioniert:
#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);
}
Sie können tcdrain verwenden und tcflush nicht nur für in/out/err fd.