2013-11-27 13 views
6

Quando inserisco un valore corretto (un numero intero) è buono. Ma quando entro in un personaggio, ottengo un ciclo infinito. Ho esaminato ogni lato di questo codice e non sono riuscito a trovare alcun problema. Perché sta succedendo? Sto usando g ++ 4.7 su Windows.Perché questo codice mi dà un ciclo infinito?

#include <iostream> 
#include <limits> 

int main() 
{ 
    int n; 
    while (!(std::cin >> n)) 
    { 
     std::cout << "Please try again.\n"; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     std::cin.clear(); 
    } 
} 

ingresso: x
uscita:

enter image description here

+0

c'è un carattere non stampabile come CR che arriva insieme all'input quando si digita o si cade un personaggio? –

+0

Basta usare 'scanf'. Modo più facile e più chiaro. –

+0

@Joker_vD Ma pensavo che fosse C++ ... –

risposta

6

È perché le operazioni di recupero sono nell'ordine sbagliato. Prima cancella l'errore, quindi cancella il buffer.

std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

Grazie. Non potrei nemmeno dirlo! :) –

+1

Il punto è che, poiché lo stream è in uno stato di errore, anche "ignore" avrà esito negativo a meno che non si cancelli prima l'errore. – john

4

dovete clear lo stato di errore prima, e poi ignore il contenuto del buffer analizzabile. Altrimenti, ignore non farà nulla su un flusso che non è in buono stato.

Sarà necessario eseguire separatamente il raggiungimento della fine del flusso.

Problemi correlati