Wie lösche ich den Cin-Puffer in C ++?
Wie lösche ich den Cin-Puffer in C ++?
Antworten:
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 (z. '\n'
B. um eine einzelne Zeile zu ignorieren).
Außerdem: Sie möchten wahrscheinlich auch std::cin.clear();
vorher ein: 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
die erste Anweisung oben verwende und verwende, um den cin
Puffer zu leeren , werden Sie so lange zur Eingabe aufgefordert , bis ich sie EOF
durch Drücken ctrl+d
eingebe.
cin.clear();
fflush(stdin);
Dies war das einzige, was für mich beim Lesen von der Konsole aus funktioniert hat. In jedem anderen Fall würde es entweder unbegrenzt lesen, weil \ n fehlt, oder es würde etwas im Puffer verbleiben.
EDIT: Ich fand heraus, dass die vorherige Lösung die Dinge 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.
Das erste und einfachste ist zum std::getline()
Beispiel:
std::getline(std::cin, yourString);
... das den Eingabestream verwirft, wenn er in eine neue Zeile gelangt. Lesen Sie mehr über diese Funktion hier .
Eine andere Option, die den Stream direkt verwirft, ist diese ...
#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());
Ich bevorzuge:
cin.clear();
fflush(stdin);
Es gibt ein Beispiel, in dem 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 jedoch gemäß dem Standard ein undefiniertes Verhalten. fflush () ist nur für Ausgabestreams gedacht. fflush (stdin) scheint nur unter Windows (zumindest mit GCC- und MS-Compilern) wie erwartet als Erweiterung des C-Standards zu funktionieren .
Wenn Sie es verwenden, ist Ihr Code also nicht portabel.
Siehe Verwenden von fflush (stdin) .
Eine Alternative finden Sie auch unter http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 .
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, daher war dies praktisch.
Einfachster Weg:
cin.seekg(0,ios::end);
cin.clear();
Es positioniert nur den cin-Zeiger am Ende des stdin-Streams und cin.clear () löscht alle Fehlerflags wie das EOF-Flag.
Folgendes sollte funktionieren:
cin.flush();
Auf einigen Systemen ist es nicht verfügbar und dann können Sie Folgendes verwenden:
cin.ignore(INT_MAX);
flush
Methode nur zur Ausgabe und behandelt bereits geschriebene Zeichen.
basic_istream<char>' has no member named 'flush'
cin.get()
scheint es seltsamerweise automatisch zu spülen (wahrscheinlich jedoch nicht bevorzugt, da dies verwirrend und wahrscheinlich temperamentvoll ist).
Es hat bei mir funktioniert. Ich habe for-Schleife mit getline () verwendet.
cin.ignore()