2016-11-23 3 views
1

Linie Im Moment habe ich diese Funktion:While-Schleife überspringt

double GrabNumber() { 
    double x; 
    cin >> x; 
    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

Sein Zweck ist zu prüfen, ob x eine gültige Zahl ist, zurückkehr es, wenn sie gültig ist oder sich wiederholende cin >> x, wenn es nicht ist.

Es während dieser Funktion aufgerufen wird:

void addition() { 
    cout << "\nEnter the first number: "; 
    double a = GrabNumber(); 
    cout << "Enter the second number: "; 
    double b = GrabNumber(); 
// rest of code 

Wenn ich schreibe zum Beispiel „6+“, wenn er mir sagt, die erste Nummer einzugeben, sie es akzeptiert, aber in die zweite Zeile geht sofort und nennt es ein Fehler, wo ich nicht einmal meine Eingabe eingegeben habe.

Ich nehme an, dies liegt daran, dass der erste Eingang nur "6" akzeptiert, während "+" zum zweiten Eingang geht und einen Fehler zurückgibt. Daher muss ein Problem mit den Parametern while vorliegen.

+1

Ich denke, Sie müssen ['getline'] (http: // www .cplusplus.com/reference/string/string/getline /) und analysiere die komplette Zeile, anstatt "cin" so zu verwenden – Garf365

+0

Aber Getline liest als String –

Antwort

4

Wenn Ihre Eingabe sofort erfolgreich ist, ignorieren Sie nicht den Rest der Zeile, die in die nächste Eingabe endet. Dies kann behoben werden, indem einfach der Anruf cin.ignore dupliziert wird.

double GrabNumber() { 
    double x; 
    cin >> x; 

    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- 

    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

ich verlassen werde diesen Code als eine Übung Trocknen;)

2

diese Art von Problem zu vermeiden, lieber mit getline und stod:

double GrabNumber() { 
    double x; 
    bool ok = false; 
    do 
    { 
     std::string raw; 
     std::getline (std::cin, raw); 
     try 
     { 
      x = stod(raw); 
      ok = true; 
     } 
     catch(...) 
     {} 
    } while(!ok); 
    return x; 
} 

Im allgemeinen Fall ist es einfacher, akquiriere rohe Zeichenkette mit getline und analysiere sie gleich danach. Auf diese Weise können Sie überprüfen, alles was Sie wollen: Anzahl der Zeichen, Zeichenposition, wenn es nur numerische Zeichen, usw.