2016-07-23 4 views
1

Warum zeigt der Computer bei Eingabe mehrerer Buchstaben "wie lang ist die Straße in Metern?" Und "Bitte geben Sie eine Ganzzahl ein, die zwischen 0 und 250 liegt." mehr als einmalWarum ist diese Schleife mehr als einmal, wenn Buchstaben eingegeben werden?

Zum Beispiel, wenn ich das eingeben „abc“ die Konsole angezeigt werden:

, wie lange ist die Straße in Metern

abc

Bitte geben Sie eine ganze Zahl zwischen 0 und 250. , wie lange ist die Straße in Metern

einen Integer Bitte geben Sie die in Metern zwischen 0 und 250. , wie lange ist die Straße

ist

Bitte geben Sie eine ganze Zahl zwischen 0 und 250. wie lange ist der Weg in Metern

while (!valid) 
    { 
     cout << "how long is the road in meters " << endl; 
     cin >> road; 
     valid = true; 
     if ((cin.fail()) || ((road > 250) || (road < 0))) 
     { 
      cin.clear(); 
      cin.ignore(); 
      cout << "Please enter an Integer which is between 0 and 250." << endl; 
      valid = false; 
     } 
    } 

Antwort

1

cin.ignore(); entspricht cin.ignore(1,EOF); So übersprungen Sie nur 1 Zeichen, aber es gibt 3 im cin-Puffer . Sie sollten

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); stattdessen rufen den gesamten Puffer nach

Herausgegeben @ der mszymborski Kommentar zu löschen.

Edit 2: hinzugefügt std::, und beachten Sie, dass die Verwendung von std :: numeric_limits #include <limits>

+3

'numeric_limits :: max() 'wäre eine bessere Wette als eine seltsame Konstante wie' 1000'. Nur weil es kein größeres Programm ist, heißt das nicht, dass wir es nicht anständig schreiben sollten. – mszymborski

+0

Ja, das wäre genauer. –

0

erfordert Der Staat scheitert an char ausgelöst 'a' aus dem Eintrag "abc". Sie löschen dann den Fehler und ignorieren dieses Zeichen und diese Schleife. Das nächste verfügbare Zeichen im Eingabestream ist dann b und so weiter.

Wenn Sie die Eingabe als Ganzes behandeln wollen, können Sie eine Zeichenfolge (oder eine durchgezogene Linie) lesen und analysieren die Zeichenfolge unter Verwendung eines stringstream:

getline(cin, line); 
    stringstream sst(line); 
    sst>>road; 
    if ((sst.fail()....) 
     ... 

Online demo