Wie lösche ich den cin-Puffer in C++?
Möglicherweise:
std::cin.ignore(INT_MAX);
Dies würde alles einlesen und ignorieren, bis EOF
. (Sie können auch ein zweites Argument angeben, das das zu lesende Zeichen ist, bis (z. B. '\n'
, um eine einzelne Zeile zu ignorieren).
Außerdem: Sie möchten wahrscheinlich auch vorher eine: std::cin.clear();
ausführen, um den Stream-Status zurückzusetzen.
Ich würde die C++ - Größenbeschränkungen den C-Versionen vorziehen:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin.clear();
fflush(stdin);
Dies war das einzige, was mir beim Lesen von der Konsole geholfen hat. In jedem anderen Fall würde es entweder unbegrenzt lesen, weil\n fehlt, oder es verbleibt etwas im Puffer.
EDIT: Ich fand heraus, dass die vorherige Lösung die Sache noch schlimmer machte. DIESES funktioniert jedoch:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Ich habe zwei Lösungen dafür gefunden.
Die erste und einfachste ist die Verwendung von std::getline()
, zum Beispiel:
std::getline(std::cin, yourString);
... verwirft den Eingabestream, wenn er eine neue Zeile erreicht. Lesen Sie mehr über diese Funktion hier .
Eine weitere Option, die den Stream direkt verwirft, ist ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Viel Glück!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
Wie wäre es mit:
cin.ignore(cin.rdbuf()->in_avail());
Eine andere mögliche (manuelle) Lösung ist
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Ich kann fflush oder cin.flush () nicht mit CLion verwenden, so dass dies praktisch war.
Ich bevorzuge:
cin.clear();
fflush(stdin);
Es gibt ein Beispiel, wo cin.ignore es einfach nicht schneidet, aber ich kann im Moment nicht daran denken. Es ist eine Weile her, als ich es benutzen musste (mit Mingw).
Fflush (stdin) ist laut Standard jedoch undefiniertes Verhalten. fflush () ist nur für Ausgabestreams gedacht. fflush (stdin) scheint nur unter Windows wie erwartet zu funktionieren (mindestens mit GCC- und MS-Compilern) als Erweiterung des C-Standards .
Wenn Sie es also verwenden, wird Ihr Code nicht portierbar sein.
Siehe Verwenden von fflush (stdin) .
Siehe auch http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 für eine Alternative.
Einfachster Weg:
cin.seekg(0,ios::end);
cin.clear();
Es positioniert lediglich den cin-Zeiger am Ende des stdin-Streams und cin.clear () löscht alle Fehlerflags wie das EOF Flag.
#include <stdio_ext.h>
und dann die Funktion verwenden
__fpurge(stdin)
Folgendes sollte funktionieren:
cin.flush();
Auf einigen Systemen ist es nicht verfügbar und dann können Sie Folgendes verwenden:
cin.ignore(INT_MAX);
cin.get()
scheint es seltsamerweise automatisch zu spülen (wahrscheinlich jedoch nicht bevorzugt, da dies verwirrend und wahrscheinlich temperamentvoll ist).