Float in String, Stringlänge und suchen in Strings



  • Hallo, ich habe eine Funktion geschrieben die kontrollieren soll, ob die Eingaben in ein Textfeld der Vorgabe entsprechen. Beim überprüfen der Floatwerte die in String konvertiert wurden macht das Programm aber nicht was es eigentlich sollte...

    Beispielsweise sagt er beim eingeben von "234" (Beispiel!), dass Durchschnittsgeschwindigkeit maximal 5 Vorkommastellen haben darf (obwohl es ja erfüllt ist). Ähnlich ist es mit Nachkommastellen. Auffallend ist, dass das Problem eigentlich nur beim 2. Floatwert (Durchschnittsgeschwindigkeit) auftritt und nicht beim 1. (Entfernung). Selbst wenn ich beide Werte gleich habe tritt das Problem nur beim 2. auf. Wahrscheinlich liegt es in der Konvertierung der Floats in String oder so ähnlich. Ich weiß nicht mehr weiter... zumal die Berechnungen bei beiden Werten identisch sind. Ich hoffe jemand kann helfen. Hier ist der Code der Funktion:

    // *** check_eingabe ueberprueft ob die eingegebenen Werte der Vorgabe entsprechen *** //
    bool check_eingabe(Route &r) {
         std::string o1 = r.ort1();
         std::string o2 = r.ort2();
         float ef = r.entfernung();
         float dgf = r.durchschnittsgeschwindigkeit();
         std::ostringstream os; //wandelt die float Zahlen in Strings um
         os << ef; //Schreibt Entfernung als float in den Stream...
         std::string e = os.str(); //schreibt Entfernung als String aus dem Stream
         os << dgf;
         std::string dg = os.str();
         //Testet Start- und Zielort auf korrekte Stringlaenge
         if(o1.size() == 0) {message("Es muss ein Startort eingegben werden!"); return false;}
         if(o1.size() > 30) {message("Der Startort hat zu viele Zeichen!"); return false;}
         if(o2.size() == 0) {message("Es muss ein Zielort eingegben werden!"); return false;}
         if(o2.size() > 30) {message("Der Zielort hat zu viele Zeichen!"); return false;}
         //Entfernung und Durchschnittsgeschwindigkeit muessen groesser als Null sein
         if(ef <= 0) {message("Die Entfernung muss groesser als Null sein!"); return false;}
         if(dgf <= 0) {message("Die Durchschnittsgeschwindigkeit muss groesser als Null sein!"); return false;}
         //Wenn Entfernung und Durchschnittsgeschwindigkeit keine Nachkommastellen haben, duerfen sie maximal 5 Zeichen lang sein
         if(e.find(".") == std::string::npos and e.size() > 5) {message("Entfernung: Es sind maximal 5 Vorkommastellen erlaubt!"); return false;}
         if(dg.find(".") == std::string::npos and dg.size() > 5) {message("Durchschnittsgeschwindigkeit: Es sind maximal 5 Vorkommastellen erlaubt!"); return false;}
         //Wenn Entfernung und Durchschnittsgeschwindigkeit Nachkommastellen haben, darf die Kommastelle maximal an Position 5 (zaehlt ab 0) kommen
         if(e.find(".") != std::string::npos and e.find(".") > 5) {message("Entfernung: Es sind maximal 5 Vorkommastellen erlaubt!"); return false;}
         if(dg.find(".") != std::string::npos and dg.find(".") > 5) {message("Durchschnittsgeschwindigkeit: Es sind maximal 5 Vorkommastellen erlaubt!"); return false;}
         //Entfernung und Durchschnittsgeschwindigkeit duerfen maximal 2 Nachkommastellen haben
         if(e.find(".") != std::string::npos and (e.size() - e.find(".") - 1) > 2) {message("Entfernung: Es sind maximal 2 Nachkommastellen erlaubt!"); return false;}
         if(dg.find(".") != std::string::npos and (dg.size() - dg.find(".") - 1) > 2) {message("Durchschnittsgeschwindigkeit: Es sind maximal 2 Nachkommastellen erlaubt!"); return false;}
         return true;
    }
    


  • Geh mal in den Debugger und guck dir an was nach

    std::string e = os.str();
    os << dgf;
    std::string dg = os.str();
    

    in dg steht ... solltest eigentlich an der stelle was vergessen haben ...



  • Hallo, also wie das mit dem Debugger funktioniert weiß ich irgendwie jetz garnich so genau (das Programm is mit fltk und läuft nich wie ne normale Konsolenanwendung Schritt für Schritt, darum is das mit der Ablaufverfolgung irgendwie nich so...). Naja, auch egal... Denke mal es liegt daran, dass man die Stream Variable erst irgendwie leeren muss. Aber weiß nich wie das geht. Hatte das mit der Konvertierung so im web gefunden und da war es nur für eine Variable. Habe es jetzt so gelöst, dass ich 2 Streamvariablen angelegt hab:

    std::ostringstream os1, os2; //wandelt die float Zahlen in Strings um
         os1 << ef; //Schreibt Entfernung als float in den Stream...
         std::string e = os1.str(); //schreibt Entfernung als String aus dem Stream
         os2 << dgf;
         std::string dg = os2.str();
    

    Geht es vielleicht auch besser, oder is das ok so?



  • Funktioniert denn jetzt der Rest deiner Funktion?

    std::ostringstream float_to_string;
    float_to_string << ef; 
    std::string string_e = float_to_string.str();
    float_to_string.clear(); // <= !!!
    float_to_string.str(""); // <= !!!
    float_to_string << dgf;
    std::string string_d = float_to_string.str();
    

    so kannst du den leeren... einfach den Inhalt auf "" setzen 😉 und alle Fehlerflags usw löschen ..



  • Hallo, also mit der Variante die ich vorhin gepostet hatte hat es funktioniert. Denke mal ist auch ok das so zu implementieren. Ist vom Aufwand ja kaum ein Unterschied. Trotzdem danke!


Anmelden zum Antworten