Come posso cancellare il buffer cin in C ++?
Come posso cancellare il buffer cin in C ++?
Risposte:
Possibilmente:
std::cin.ignore(INT_MAX);
Questo avrebbe letto e ignorato tutto fino a quando EOF
. (puoi anche fornire un secondo argomento che è il carattere da leggere fino a quando (es: '\n'
per ignorare una singola riga).
Inoltre: probabilmente vorrai fare anche: std::cin.clear();
prima di questo per ripristinare lo stato del flusso.
Preferirei i vincoli di dimensione C ++ rispetto alle versioni 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
e utilizzo la prima istruzione sopra per svuotare il cin
buffer, continua a chiedere input fino a quando non accetto EOF
premendo ctrl+d
?
cin.clear();
fflush(stdin);
Questa è stata l'unica cosa che ha funzionato per me durante la lettura da console. In ogni altro caso potrebbe leggere indefinitamente a causa della mancanza di \ n, o qualcosa rimarrebbe nel buffer.
EDIT: ho scoperto che la soluzione precedente ha peggiorato le cose. QUESTO invece, funziona:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Ho trovato due soluzioni a questo.
Il primo, e più semplice, è usare std::getline()
ad esempio:
std::getline(std::cin, yourString);
... che scarterà il flusso di input quando arriverà a una nuova riga. Maggiori informazioni su questa funzione qui .
Un'altra opzione che scarta direttamente il flusso è questa ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
In bocca al lupo!
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";
Che ne dite di:
cin.ignore(cin.rdbuf()->in_avail());
Preferisco:
cin.clear();
fflush(stdin);
C'è un esempio in cui cin.ignore non lo taglia, ma al momento non ci penso. Qualche tempo fa avevo bisogno di usarlo (con Mingw).
Tuttavia, fflush (stdin) è un comportamento non definito secondo lo standard. fflush () è pensato solo per flussi di output. fflush (stdin) sembra funzionare solo come previsto su Windows (con GCC e MS compilatori almeno) come un'estensione allo standard C .
Quindi, se lo usi, il tuo codice non sarà portabile.
Vedere Utilizzo di fflush (stdin) .
Inoltre, vedere http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 per un'alternativa.
Un'altra possibile soluzione (manuale) è
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Non posso usare fflush o cin.flush () con CLion, quindi questo è stato utile.
Modo più semplice:
cin.seekg(0,ios::end);
cin.clear();
Posiziona semplicemente il puntatore cin alla fine del flusso stdin e cin.clear () cancella tutti i flag di errore come il flag EOF.
Quanto segue dovrebbe funzionare:
cin.flush();
Su alcuni sistemi non è disponibile e quindi puoi utilizzare:
cin.ignore(INT_MAX);
flush
metodo è solo per l'output e si occupa di caratteri già scritti.
basic_istream<char>' has no member named 'flush'
cin.get()
sembra scaricarlo automaticamente in modo abbastanza strano (probabilmente non preferito, dato che questo è confuso e probabilmente di temperamento).
Ha funzionato per me. Ho usato il ciclo for con getline ().
cin.ignore()