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)
    var123var1 23 var2 40.3

    das 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.


Anmelden zum Antworten