Problem mit String replace
-
Hallo
Ich habe folgendes Problem, hier erstmal das Codestueck das den Fehler produziert
bool Interpreter::parsestring(const objset& set) { objset::const_iterator siter = set.begin(); objmap::const_iterator miter; string::size_type pos; char buff[45]; for (; siter != set.end(); siter++) { miter = _f->getobjects().find(*siter); if (miter != _f->getobjects().end()) { pos = _parsedformula.find((*miter).first); sprintf(buff, "%g", (*miter).second); _parsedformula.replace(pos-1, (*miter).first.size()+1, buff); // genau hier, out of range } else return 1; } return 0; }im siter set befinden sich variablen die ich per map suche und dann im String ersetzen will zb:
sieht die Formel so aus$var1 + 4 - $var2
in der map steht dann
first(schluessel) second(wert)
var2 40.3das Ergebniss sollte dann folgendes sein
23 + 4 - 40.3
ehrlichgesagt wundert es mich auch nicht das ich "out of range" bekomme, ich versteh leider die Funktion replace nicht genau.. sie macht irgendwie was sie will (zB wenn ich die Iteratoren um +1 oder -1 aendere veraendert sich manchmal etwas manchaml auch nicht.. ich weis hoert sich absolut dumm an
)naja trotzdem, kann mir wer tipps geben wie ich das besser machen kann, ist ja auch nicht grad das gelbe vom Ei die Funktion
mfg leo
-
Hier ein kleines Beispiel:
#include <string> #include <iostream> int main() { using namespace std; string foo = "%e1% + 4 + %e2%"; size_t pos = foo.find("%e1%"); if(pos != string::npos) foo.replace(pos,4,"10000");// Ersetze 4 Zeichen mit 5 pos = foo.find("%e2%"); if(pos != string::npos) foo.replace(pos,4,"33");// Ersetze 4 Zeichen mit 2 cout << foo << endl; return EXIT_SUCCESS; }Also probiers mal so:
if(pos != std::string::npos) _parsedformula.replace(pos, (*miter).first.size(), buff);Achja und ersetze das sprintf bitte, das ist nicht sonderlich sicher was buffer overflows angeht. Mag vielleicht schneller sein aber wie gesagt nicht sonderlich sicher.
Nimm entweder boost::lexical_cast<> oder std::stringstream für die konvertierung.