Comment effacer le buffer cin en C++?
Peut-être:
std::cin.ignore(INT_MAX);
Ceci lirait et ignorerait tout jusqu’à EOF
. (vous pouvez également fournir un deuxième argument qui est le caractère à lire jusqu'à (ex: '\n'
pour ignorer une seule ligne).
Aussi: Vous voudrez probablement faire un: std::cin.clear();
avant cela aussi pour réinitialiser l'état du flux.
Je préférerais les contraintes de taille C++ aux versions C:
// 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);
Ce fut la seule chose qui a fonctionné pour moi lors de la lecture de la console. Dans tous les autres cas, il lirait indéfiniment faute de\n, ou quelque chose resterait dans la mémoire tampon.
EDIT: J'ai découvert que la solution précédente aggravait les choses. Celui-ci cependant fonctionne:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
J'ai trouvé deux solutions à cela.
La première, et la plus simple, consiste à utiliser std::getline()
par exemple:
std::getline(std::cin, yourString);
... qui supprimera le flux d'entrée lorsqu'il atteindra une nouvelle ligne. En savoir plus sur cette fonction ici .
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!
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";
Que diriez-vous:
cin.ignore(cin.rdbuf()->in_avail());
Une autre solution possible (manuelle) est
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Je ne peux pas utiliser fflush ou cin.flush () avec CLion, c'est donc très pratique.
Je préfère:
cin.clear();
fflush(stdin);
Il y a un exemple où Cin.ignore ne coupe tout simplement pas, mais je ne peux pas y penser pour le moment. C'était il y a quelque temps quand j'ai eu besoin de l'utiliser (avec Mingw).
Cependant, fflush (stdin) est un comportement indéfini selon la norme. fflush () est uniquement destiné aux flux de sortie. fflush (stdin) semble seulement fonctionner comme prévu sous Windows (avec les compilateurs GCC et MS au moins) en tant qu’extension du standard C .
Donc, si vous l'utilisez, votre code ne sera pas portable.
Voir tilisation de fflush (stdin) .
Voir aussi http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 pour une alternative.
Manière la plus simple:
cin.seekg(0,ios::end);
cin.clear();
Il positionne simplement le pointeur cin à la fin du flux stdin et cin.clear () efface tous les indicateurs d'erreur tels que l'indicateur EOF.
#include <stdio_ext.h>
et ensuite utiliser la fonction
__fpurge(stdin)
Ce qui suit devrait fonctionner:
cin.flush();
Sur certains systèmes, ce n'est pas disponible et vous pouvez alors utiliser:
cin.ignore(INT_MAX);
cin.get()
semble le rincer automatiquement assez curieusement (probablement pas préféré cependant, car c'est déroutant et probablement capricieux).