2016-08-12 2 views
2

Ich versuche, den Benutzer zu beschränken, nur '1' oder '2' einzugeben.Endlosschleife, wenn ein Zeichen eingegeben wird

int ch; 

do 
{ 
    cout<<"Enter: \n"; 
    cin>>ch; 
    switch(ch) 
    { 
    case 1: 
     cout<<"1"; 
     break; 
    case 2: 
     cout<<"2"; 
     break; 
    default: 
     cout<<"Retry\n"; 
    } 
}while(ch != 1 && ch != 2); 

wenn ich eine andere Zahl als 1 oder 2 ein, das Programm feinen läuft durch den Benutzer zu fragen, jedoch erneut zu versuchen, wenn ich ein Zeichen eingeben, tritt das Programm in eine Endlosschleife von ‚Retry‘ und ‚Enter‘ .

Antwort

3

Das liegt daran, dass der Eingabeoperator das Zeichen nicht als Integer verarbeiten kann und das Zeichen im Puffer belässt, wenn Sie ein Zeichen eingeben, das keine Ziffer ist. Also nächste Wiederholung der Schleife liest es das exakt gleiche Zeichen erneut. Und immer wieder und so weiter.

Der einfachste Weg, dieses Problem zu überwinden, ist einfach, den Strom zu bitten, ignore den Rest der Zeile:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input 

Es gibt auch andere Möglichkeiten, wie die ganze Zeile in einen String zu lesen, setzen, dass Zeichenfolge in einen Eingabezeichenfolgenstream und lesen Sie stattdessen die ganze Zahl aus diesem Stream. Ein bisschen mehr Arbeit. Auf diese Weise müssen Sie nicht nach Eingabefehlern unter std::cin suchen, was Sie jedoch mit der obigen Methode tun müssen.

Sie vollständige Code könnte so etwas wie

aussehen
int n; 
do 
{ 
    if (!std::cin >> n) 
    { 
     std::cout << "Only numbers accepted. Please try again.\n"; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Skip bad input 
     std::cin.clear(); // Clear error flags 
    } 

    // switch ... 
} while (...); 
Verwandte Themen