2017-04-10 1 views
0

Ich habe ein Programm, das die Fähigkeit hat, Benutzereingaben zu verwerfen, wenn ein Zeichen anstelle eines int eingegeben wird, und das funktioniert fast perfekt - alles eingegeben, das keine Nummer ist, wird zurückgewiesen.Wie man char-Eingaben in cin zurückweist und minimale und maximale int-Werte definiert?

Allerdings müssen alle diese cin s jeden Wert zwischen einem Minimum und einem Maximum akzeptieren, aber ich kann es nicht zum Funktionieren bringen. Der Code unten zeigt meine bisherigen Bemühungen, aber es gibt einen kleinen Fehler. Wenn ein Char eingegeben wird, gefolgt von einem int, der außerhalb des Bereichs ist, und ein anderer char eingegeben wird (Ich möchte rigoros testen - ich meine, wer weiß, was passieren könnte, wenn ein tatsächlicher Endbenutzer über die Problem) das Programm wirft den Endwert von hypothekenTerm heraus als 0.

Könnte mir jemand sagen, wo ich falsch liege und mir irgendwelche Hinweise geben, um mir zu helfen, es zu beheben? Vielen Dank im Voraus an alle, die mir helfen können, mein Problem zu lösen!

int mortgageTerm; 
string line; 
cout << "Mortgage term (1 - 40 years) : "; 
while (!(cin >> mortgageTerm)) 
{ 
    cout << "That's not a valid choice! Try again : "; 
    cin.clear(); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
} 
while (getline(cin, line)) 
{ 
    stringstream linestream; 
    if (!linestream >> mortgageTerm) 
    { 
     cout << "Input was not a number! Try again : "; 
     cin >> mortgageTerm; 
     continue; 
    } 
    if ((mortgageTerm <= 0 || mortgageTerm > 40)) 
    { 
     cout << "Input out of range. Try again : "; 
     cin >> mortgageTerm; 
     continue; 
    } 
    char errorTest; 
    if (linestream >> errorTest) 
    { 
     cout << "Invalid input. Try again : "; 
     cin >> mortgageTerm; 
     continue; 
    } 
    break; 
} 
cout << mortgageTerm; 
+0

ziemlich ein dupe [dieser] (http://stackoverflow.com/questions/10828937/how-to-make- cin-take-only-numbers), aber es macht keine Bereichsüberprüfung (ziemlich trivial hinzuzufügen). – NathanOliver

+0

@NathanOliver yeah das ist das, das gerade im Programm ist, ich habe Bug checked, als ich merkte, dass ich ein Problem losgeworden war und ein anderes in Form von Bereichsüberprüfung –

Antwort

0

Sie sind fast da. Ihr erstes Problem ist Ihre erste While-Schleife wird überhaupt nicht benötigt. Dann müssen wir nur die zweite Schleife optimieren, um sicherzustellen, dass der gesamte gelesene Eingang in dem Wert verwendet wurde, den Sie erhalten. Wir können es auch vereinfachen, indem eine einzige Fehler Anweisung, gibt Ihnen diese Änderungen zu machen

int mortgageTerm; 
string line; 
cout << "Mortgage term (1 - 40 years) : "; 
while (getline(cin, line)) // consume all input given 
{ 
    stringstream linestream(line); // you have to construct the stream from the string here 
    linestream >> mortgageTerm; // try and read the data 
    if (!linestream.eof() || mortgageTerm <= 0 || mortgageTerm > 40) 
    { 
     // either there is input left in linestream or the value is not in range 
     cout << "Invalid input. Try again : "; 
    } 
} 
+0

Vielen Dank! Es funktioniert alles jetzt –

+0

@RobDudley Kein Problem, froh, zu helfen. Ich habe bemerkt, dass ich einen Fehler im Code hatte und ich habe ihn aktualisiert. – NathanOliver

+0

Ich hoffe er versteht, warum das funktioniert. Der Unterschied zwischen Operator >> und getline, und warum die Überprüfung für EOF vorhanden ist. Wenn Sie versuchen, eine ganze Zeile als einen einzelnen Wert zu behandeln, können Sie getline auf diese Weise verwenden und EOF überprüfen, dass keine zusätzlichen Daten vorhanden sind. Viele Leute geben jedoch gerne alle ihre Eingaben auf einmal oder aus einer Datei und mit dem Operator >> analysiert sie alle diese Token. Zum Beispiel könnte "9 0.1 ABC" drei Felder auf der gleichen Linie sein und der Operator >> würde an jedem von ihnen aufgerufen werden. –

0

überprüfen Nur für das Minimum und Maximum im gleichen Zustand, in dem Sie überprüfen, ob es in ein int umgewandelt werden kann, || verwenden, in einem Zustand der Ausdrücke geprüft links nach rechts um, so der erste hat seine Arbeit bereits getan, wenn Sie den zweiten bewerten und MortgageTerm den Wert haben wird.

Bearbeitet um Kommentare zu adressieren.

int mortgageTerm; 
cout << "Mortgage term (1 - 40 years) : "; 

while (!(cin >> mortgageTerm) || 
     mortageTerm < 1  || 
     mortgageTerm > 40  ) 
{ 
    cout << "That's not a valid choice! Try again : "; 
    cin.clear(); 
    cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 
} 

// If you are concerned about extra input after the number and want to clear the input stream 
// cin.ignore(std::numeric_limits<streamsize>::max(), '\n'); 
+0

eingeführt hatte '39a', was das' a' im Puffer belässt und die nachfolgenden Lesevorgänge durcheinander bringt. – NathanOliver

+0

Dies funktioniert zu einem gewissen Grad, aber jetzt ist das Problem ich konfrontiert ist, wenn das Zeichen eingegeben hat mehr als ein Zeichen (zB "eins"), die Fehlermeldung wiederholt sich für die Anzahl der Zeichen in der Eingabe: Hypothek Begriff (1 - 40 Jahre): ein Das ist keine gültige Wahl! Versuchen Sie es erneut: Das ist keine gültige Wahl! Versuchen Sie es erneut: Das ist keine gültige Wahl! Versuchen Sie es erneut: –

Verwandte Themen