Comment effacer le tampon cin en C ++?
Comment effacer le tampon cin en C ++?
Réponses:
Peut-être:
std::cin.ignore(INT_MAX);
Cela lirait et ignorerait tout jusqu'à ce que EOF
. (vous pouvez également fournir un deuxième argument qui est le caractère à lire jusqu'à (ex: '\n'
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
et utilise la première instruction ci-dessus pour vider le cin
tampon, alors il continue à demander une entrée jusqu'à ce que j'entre EOF
en appuyant sur ctrl+d
?
cin.clear();
fflush(stdin);
C'était la seule chose qui fonctionnait pour moi lors de la lecture depuis la console. Dans tous les autres cas, il serait lu indéfiniment en raison du manque de \ n, ou quelque chose resterait dans le tampon.
EDIT: J'ai découvert que la solution précédente a aggravé les choses. Celui-ci fonctionne cependant:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
J'ai trouvé deux solutions à cela.
Le premier, et le plus simple, consiste à utiliser std::getline()
par exemple:
std::getline(std::cin, yourString);
... cela rejettera 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());
Je préfère:
cin.clear();
fflush(stdin);
Il y a un exemple où cin.ignore ne le coupe tout simplement pas, mais je ne peux pas y penser pour le moment. Il y a quelque temps, j'avais besoin de l'utiliser (avec Mingw).
Cependant, fflush (stdin) est un comportement non défini selon la norme. fflush () est uniquement destiné aux flux de sortie. fflush (stdin) ne semble fonctionner comme prévu sur Windows (avec les compilateurs GCC et MS au moins) comme une extension à la norme C .
Donc, si vous l'utilisez, votre code ne sera pas portable.
Voir Utilisation de fflush (stdin) .
Voir également http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 pour une alternative.
Une autre solution (manuelle) possible 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.
Moyen le 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.
Les éléments suivants devraient fonctionner:
cin.flush();
Sur certains systèmes, il n'est pas disponible et vous pouvez alors utiliser:
cin.ignore(INT_MAX);
flush
méthode est pour la sortie uniquement et traite des caractères déjà écrits.
basic_istream<char>' has no member named 'flush'
cin.get()
semble le vider automatiquement assez curieusement (probablement pas préféré, car cela est déroutant et probablement capricieux).
Cela a fonctionné pour moi. J'ai utilisé une boucle for avec getline ().
cin.ignore()