it-swarm.com.de

Wie spüle ich den Cin-Puffer?

Wie lösche ich den cin-Puffer in C++?

103
Tal

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.

94
Evan Teran

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')
107
Martin York
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');
}
21
jyggorath

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!

9
Ben
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";
7
user187046

Wie wäre es mit:

cin.ignore(cin.rdbuf()->in_avail());
3
asdf

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.

3
Bobul Mentol

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.

3
Shadow2531

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)
1
techcomp

Folgendes sollte funktionieren:

cin.flush();

Auf einigen Systemen ist es nicht verfügbar und dann können Sie Folgendes verwenden:

cin.ignore(INT_MAX);
1
Gunnar Steinn

cin.get() scheint es seltsamerweise automatisch zu spülen (wahrscheinlich jedoch nicht bevorzugt, da dies verwirrend und wahrscheinlich temperamentvoll ist).

0
GuestPerson001