Wie validiere ich Benutzereingaben als Double in C++?

Lesezeit: 2 Minuten

Wie validiere ich Benutzereingaben als Double in C
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

Wie validiere ich Benutzereingaben als Double in C
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;
}
}

Ich würde … benutzen:

double x;

while (!(std::cin >> x)) {
  std::cin.clear();
  std::cin.ignore(2147483647, '\n');
  std::cout << "Error.\n";
}

oder

double x;

while ((std::cout << "> ") && !(std::cin >> x)) {
  std::cin.clear();
  std::cin.ignore(2147483647, '\n');
  std::cout << "Error.\n";
}

Wie validiere ich Benutzereingaben als Double in C
cpx

Eine Möglichkeit besteht darin, auf Gleichheit von Gleitkommazahlen zu prüfen.

double x;

while (1) {
    cout << '>';
    cin >> x;
    if (x != int(x)) {
        // valid number
        break;
    } else {
        // not a valid number
        cout << "Invalid Input! Please input a numerical value." << endl;
    }
}

963660cookie-checkWie validiere ich Benutzereingaben als Double in C++?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy