Wie validiere ich Benutzereingaben als Double in C++?
Lesezeit: 2 Minuten
Christo
Wie würde ich überprüfen, ob die Eingabe wirklich ein Double ist?
double x;
while (1) {
cout << '>';
if (cin >> x) {
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
}
}
//do other stuff...
Der obige Code gibt unendlich die aus Invalid Input! Anweisung, so dass es nicht zu einer weiteren Eingabe auffordert. Ich möchte zur Eingabe auffordern, prüfen, ob sie legitim ist … wenn es ein Doppel ist, weitermachen … wenn es KEIN Doppel ist, erneut auffordern.
Irgendwelche Ideen?
Schauen Sie sich beim nächsten Posten unbedingt den Formatierungsleitfaden an. Danke.
– Nachzügler
18. Juli 2010 um 1:39 Uhr
Was meinen Sie? was ist an der formatierung falsch?
– Christo
18. Juli 2010 um 1:39 Uhr
Ich habe Ihren Beitrag bearbeitet, aber vor der Bearbeitung war der Code nicht formatiert. Klicken Sie auf „Vor N Minuten bearbeitet“, um den ursprünglichen Beitrag anzuzeigen.
– Nachzügler
18. Juli 2010 um 1:43 Uhr
Ich verstehe … ich dachte, ich hätte das getan … muss den Formatierungsknopf übersehen und versehentlich etwas anderes gedrückt haben. Entschuldigen Sie.
– Christo
18. Juli 2010 um 1:45 Uhr
Versuche dies:
while (1) {
if (cin >> x) {
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
cin.clear();
while (cin.get() != '\n') ; // empty loop
}
}
Dies löscht im Grunde den Fehlerstatus, liest und verwirft dann alles, was in der vorherigen Zeile eingegeben wurde.
ist das drin while(1) Schleife?
– Christo
18. Juli 2010 um 1:56 Uhr
Anstatt while(cin.get() != '\n');würde ich einfach verwenden cin.sync();. Es ist meiner Meinung nach besser lesbar.
– ChaosTechniker
18. Juli 2010 um 2:08 Uhr
Unter UNIX ist es a \r\nalso gibt es noch eine \n Am Ende. Also ja, es wird funktionieren.
– Casablanca
18. Juli 2010 um 2:10 Uhr
@chaosTechnician, cin.sync() funktioniert bei mir nicht, wenn ich dieses Beispiel versuche. das while(cin.get() != ‘\n’); tut es aber. Irgendeine Idee warum?
– Mahmud Abdelkader
18. Juli 2010 um 6:48 Uhr
Nein, es wurde vorher geschrieben: cin.sync(); Hier ist ein Ausschnitt des Codes: int main(int argc, char *argv[]) { Doppel-X; while (1) { cout << '>‘; if (cin >> x) {break; } else { // keine gültige Zahl cout << "Ungültige Eingabe! Bitte geben Sie einen numerischen Wert ein." << endl; cin.clear(); cin.sync(); // while(cin.get() != '\n'); } } cout << "Sie haben eingegeben: " << x << endl; 0 zurückgeben; }
– Mahmud Abdelkader
20. Juli 2010 um 18:31 Uhr
Ben Voigt
failbit wird nach der Verwendung eines Extraktionsoperators gesetzt, wenn ein Parsing-Fehler aufgetreten ist, gibt es ein paar einfache Testfunktionen good und fail Du kannst nachschauen. Sie sind genau das Gegenteil von einander, weil sie handhaben eofbit anders, aber das spielt in diesem Beispiel keine Rolle.
Dann musst du ausräumen failbit bevor Sie es erneut versuchen.
Wie Casablanca sagt, müssen Sie auch die nicht numerischen Daten verwerfen, die noch im Eingabepuffer verbleiben.
Damit:
double x;
while (1) {
cout << '>';
cin >> x;
if (cin.good())
// valid number
break;
} else {
// not a valid number
cout << "Invalid Input! Please input a numerical value." << endl;
cin.clear();
cin.ignore(100000, '\n');
}
}
//do other stuff...
Dies führt immer noch dazu, dass die Endlosschleife die druckt Invalid Input!… es wird nicht zu einer weiteren Eingabe aufgefordert.
– Christo
18. Juli 2010 um 1:50 Uhr
Was bedeutet die cin.ignore() tun?
– Christo
18. Juli 2010 um 2:07 Uhr
Dasselbe wie bei der Casablanca-Schleife, sie wirft alle Zeichen bis einschließlich des Zeilenumbruchs weg, um alle nicht numerischen Daten loszuwerden, die dazu geführt haben, dass die erste Extraktion fehlgeschlagen ist.
– Ben Voigt
18. Juli 2010 um 2:18 Uhr
#include <iostream>
#include <string>
bool askForDouble(char const *question, double &ret)
{
using namespace std;
while(true)
{
cout << question << flush;
cin >> ret;
if(cin.good())
{
return true;
}
if(cin.eof())
{
return false;
}
// (cin.fail() || cin.bad()) is true here
cin.clear(); // clear state flags
string dummy;
cin >> dummy; // discard a word
}
}
int main()
{
double x;
if(askForDouble("Give me a floating point number! ",x))
{
std::cout << "The double of it is: " << (x*2) << std::endl;
} else
{
std::cerr << "END OF INPUT" << std::endl;
}
return 0;
}
Die Eingabevalidierung hätte einfacher sein sollen. Es macht es sehr schwierig, Neulinge zu unterrichten und ihnen zu helfen, Spaß an dem zu haben, was sie tun. Ich würde gerne ein kugelsicheres und dennoch nützliches Tutorial zu Cin und Cout für Neulinge sehen.
– Nichtliste
5. Mai 2012 um 18:25 Uhr
bool is_double(double val)
{
bool answer;
double chk;
int double_equl = 0;
double strdouble = 0.0;
strdouble = val;
double_equl = (int)val;
chk = double_equl / strdouble;
if (chk == 1.00)
{
answer = false; // val is integer
return answer;
} else {
answer = true; // val is double
return answer;
}
}
Schauen Sie sich beim nächsten Posten unbedingt den Formatierungsleitfaden an. Danke.
– Nachzügler
18. Juli 2010 um 1:39 Uhr
Was meinen Sie? was ist an der formatierung falsch?
– Christo
18. Juli 2010 um 1:39 Uhr
Ich habe Ihren Beitrag bearbeitet, aber vor der Bearbeitung war der Code nicht formatiert. Klicken Sie auf „Vor N Minuten bearbeitet“, um den ursprünglichen Beitrag anzuzeigen.
– Nachzügler
18. Juli 2010 um 1:43 Uhr
Ich verstehe … ich dachte, ich hätte das getan … muss den Formatierungsknopf übersehen und versehentlich etwas anderes gedrückt haben. Entschuldigen Sie.
– Christo
18. Juli 2010 um 1:45 Uhr