Hoe spoel ik de cin-buffer door?

Hoe wis ik de cin-buffer in C++?


Antwoord 1, autoriteit 100%

Mogelijk:

std::cin.ignore(INT_MAX);

Dit zou alles inlezen en negeren tot EOF. (u kunt ook een tweede argument opgeven, namelijk het teken dat moet worden gelezen tot (bijvoorbeeld: '\n'om een ​​enkele regel te negeren).

Ook: je wilt waarschijnlijk ook het volgende doen: std::cin.clear();om de streamstatus te resetten.


Antwoord 2, autoriteit 92%

Ik zou de C++-groottebeperkingen verkiezen boven de C-versies:

// 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')

Antwoord 3, autoriteit 23%

cin.clear();
fflush(stdin);

Dit was het enige dat voor mij werkte bij het lezen vanaf de console. In alle andere gevallen zou het ofwel oneindig blijven lezen vanwege het ontbreken van \n, of er zou iets in de buffer achterblijven.

BEWERKEN:
Ik kwam erachter dat de vorige oplossing de zaken erger maakte. DEZE werkt echter:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

Antwoord 4, autoriteit 14%

Ik heb hiervoor twee oplossingen gevonden.

De eerste en eenvoudigste is om std::getline()te gebruiken, bijvoorbeeld:

std::getline(std::cin, yourString);

… die de invoerstroom zal weggooien wanneer deze op een nieuwe regel komt. Lees hiermeer over deze functie.

Een andere optie die de stream direct verwijdert, is deze…

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

Veel succes!


Antwoord 5, autoriteit 9%

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";

Antwoord 6, autoriteit 5%

Wat dacht je van:

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

Antwoord 7, autoriteit 4%

Ik geef de voorkeur aan:

cin.clear();
fflush(stdin);

Er is een voorbeeld waarbij cin.ignore het gewoon niet haalt, maar ik kan er op dit moment niet op komen. Het was een tijdje geleden dat ik het moest gebruiken (met Mingw).

Flush(stdin) is echter ongedefinieerd gedrag volgens de standaard. fflush() is alleen bedoeld voor uitvoerstromen. fflush(stdin) lijkt alleen te werken zoals verwacht op Windows (met tenminste GCC en MS compilers) als uitbreiding op de C-standaard.

Dus als je het gebruikt, is je code niet overdraagbaar.

Zie fflush(stdin) gebruiken.

Zie ook http://ubuntuforums.org/ showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1voor een alternatief.


Antwoord 8, autoriteit 4%

Een andere mogelijke (handmatige) oplossing is

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

Ik kan fflush of cin.flush() niet gebruiken met CLion, dus dit was handig.


Antwoord 9, autoriteit 4%

Gemakkelijkste manier:

cin.seekg(0,ios::end);
cin.clear();

Het plaatst de cin-aanwijzer gewoon aan het einde van de stdin-stream en cin.clear() wist alle foutvlaggen zoals de EOF-vlag.


Antwoord 10

Het volgende zou moeten werken:

cin.flush();

Op sommige systemen is het niet beschikbaar en dan kun je het volgende gebruiken:

cin.ignore(INT_MAX);

Antwoord 11

#include <stdio_ext.h>

en gebruik dan functie

__fpurge(stdin)

Antwoord 12

Het werkte voor mij. Ik heb for loop gebruikt met getline().

cin.ignore()

Antwoord 13

cin.get()lijkt het vreemd genoeg automatisch door te spoelen (waarschijnlijk echter niet de voorkeur, aangezien dit verwarrend en waarschijnlijk temperamentvol is).

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes