Come scarico il cin-buffer?

Come posso cancellare il cin-buffer in C ++?

Possibilmente:

std::cin.ignore(INT_MAX); 

Questo avrebbe letto e ignorato tutto fino EOF . (puoi anche fornire un secondo argomento che è il carattere da leggere fino a (es: '\n' per ignorare una singola riga).

Inoltre: Probabilmente vuoi fare un: std::cin.clear(); anche prima di ripristinare lo stato del stream.

Preferirei i vincoli delle dimensioni C ++ rispetto alle versioni C:

 // Ignore to the end of file cin.ignore(std::numeric_limits::max()) // Ignore to the end of line cin.ignore(std::numeric_limits::max(), '\n') 
 cin.clear(); fflush(stdin); 

Questa è stata l’unica cosa che ha funzionato per me durante la lettura dalla console. In tutti gli altri casi, potrebbe leggere a tempo indefinito a causa della mancanza di \ n, o qualcosa rimarrebbe nel buffer.

EDIT: ho scoperto che la soluzione precedente ha peggiorato le cose. QUESTO, tuttavia, funziona:

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

Ho trovato due soluzioni a questo.

Il primo, e il più semplice, è usare std::getline() per esempio:

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

… che eliminerà il stream di input quando arriva a una nuova riga. Leggi di più su questa funzione qui .

Un’altra opzione che scarta direttamente il stream è questo …

 #include  // Possibly some other code here cin.clear(); cin.ignore(numeric_limits::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 semplicemente non lo taglia, ma al momento non riesco a pensarci. È stato qualche tempo fa quando avevo bisogno di usarlo (con Mingw).

Tuttavia, fflush (stdin) è un comportamento indefinito secondo lo standard. fflush () è pensato solo per i flussi di output. fflush (stdin) sembra funzionare come previsto su Windows (almeno con i compilatori GCC e MS) come estensione allo standard C.

Quindi, se lo usi, il tuo codice non sarà portatile.

Vedi Usare fflush (stdin) .

Inoltre, vedi http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 per un’alternativa.

Un’altra ansible soluzione (manuale) è

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

Non posso usare fflush o cin.flush () con CLion, quindi è stato utile.

Il seguente dovrebbe funzionare:

 cin.flush(); 

Su alcuni sistemi non è disponibile e quindi puoi usare:

 cin.ignore(INT_MAX); 
 #include  

e quindi utilizzare la funzione

 __fpurge(stdin) 

Il modo più semplice:

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

Posiziona semplicemente il puntatore cin alla fine dello stream stdin e cin.clear () cancella tutti i flag di errore come il flag EOF.

cin.get() sembra scaricarlo automaticamente in modo abbastanza strano (probabilmente non è preferibile, dato che è confusionario e probabilmente temperamentale).