126 votes

Comment vider le tampon cin ?

Comment effacer le tampon cin en C++ ?

133voto

Loki Astari Points 116129

Je préférerais les contraintes de taille du C++ aux versions C :

// Ignore to the end of file
std::cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

110voto

Evan Teran Points 42370

C'est possible :

std::cin.ignore(INT_MAX);

Cela permet de lire et d'ignorer tout jusqu'à EOF . (vous pouvez également fournir un second argument qui est le caractère à lire jusqu'à (ex : '\n' pour ignorer une seule ligne).

Aussi : Vous voulez probablement faire un : std::cin.clear(); avant cela aussi pour réinitialiser l'état du flux.

30voto

jyggorath Points 22
cin.clear();
fflush(stdin);

C'est la seule chose qui a fonctionné pour moi lors de la lecture de la console. Dans tous les autres cas, la lecture était soit indéfinie en raison de l'absence d'informations sur l'identité de l'utilisateur. \n ou quelque chose resterait dans la mémoire tampon.

EDIT : J'ai découvert que la solution précédente a empiré les choses. Celle-ci, par contre, fonctionne :

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

17voto

Ben Points 171

J'ai trouvé deux solutions à ce problème.

La première, et la plus simple, est d'utiliser std::getline() par exemple :

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

... qui va rejeter le flux d'entrée quand il arrive à une nouvelle ligne. En savoir plus sur cette fonction aquí .

Une autre option qui rejette directement le flux est la suivante...

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

Bonne chance !

11voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X