Std::string replace...wird die größe des Strings verändert?



  • Du musst bei replace nicht die Länge des Ersatzstückes angeben sondern die des zu ersetzenden. Schliesslich sollte er wissen wieviele Zeichen Du ersetzen willst. Wie lang der Ersatzstring ist findet er schon selbst raus 😉



  • Unbehandelte Ausnahme bei 0x7c812a5b in server.exe: Microsoft C++-Ausnahme: std::out_of_range an Speicherposition 0x010ad660..

    Das ist die Meldung an der Stelle wo ich das ersetze.

    Grüße und bis morgen (Feierabend)



  • Siehe oben, Du versuchst 19 Zeichen ab "bin" zu ersetzen. Da sind aber nur 12.



  • Ja ok, aber ich dachte, daß der string automatisch entsprechend vergrößert wird.
    Dem ist wohl nicht so.

    Wie kann ich das dann korrekt, also mit vergrößerung machen?

    grüße Mondmann



  • Hmpf...

    string text = "Kurz";
    text.replace(2, 2, "uuuuuuuuurz");
    

    ...ersetzt das "rz" durch "uuuuuuuurz"

    Der String wird automatisch vergrößert, aber Du musst ihm sagen wieviele Zeichen im String Du ersetzen willst und nicht wie lang der Ersatzstring ist.

    EDIT:
    Kleines r bei replace natürlich 😉



  • Achsoooooo....DAS war der Fehler..werde ich morgen gleich mal testen, Vielen Dank mal, mondmann



  • Habs jetzt entsprechend geändert, doch leider ist die Meldung diesselbe.
    Geht nicht.
    Geht das nur am Ende von einem String oder auch in der Mitte eines strings?

    Mondmann



  • Mondmann schrieb:

    Habs jetzt entsprechend geändert

    Kann ja jeder behaupten 😃 😕

    #include <string>
    #include <iostream>
    
    int main() {
    std::string meinstring, ersetze;
    
    meinstring="Hallo ich bin ein Text";
    ersetze="bin ein sehr kurzer";
    
    size_t pos;
    
    pos=meinstring.find("bin");
    meinstring.replace(pos,7,ersetze);
    
    std::cout << meinstring << std::endl;
    }
    

    Funktioniert bei mir einwandfrei und ist soweit ich das erkenne auch vollkommen richtig. Evtl. sollte man pos noch auf string::npos überprüfen aber in diesem Fall denke ich kann als gegeben vorausgesetzt werden, dass "bin" im String enthalten ist. 😉



  • Ok dann komm ich jetzt mit meinem Code daher, das Problem ist nämlich ein anderes.obwohl..nein eigentlich nicht..
    Also mein original Code:

    Ich habe einen String indem steht zb folgendes drin:
    Kommentar[13][10]Neue[32]Zeile[13][10]Nochmal[32]neue[32]Zeile.\0
    Die Zeichen die dazwischen stehen habe ich in den eckigen KLammern.

    Meine Aufgabe ist es nun die 2 Zeichen 13 und 10 durch das HTML Tag "<br>" zu ersetzen, also 2 Zeichen gegen die 4 Austauschen. Dabei sollte aber nichts überschrieben werden, sondern anstatt den zwei Zeichen \r\n soll nun <br> stehen.
    Also ersetzen und auseinanderschieben.
    Kann replace sowas?

    string br="<br>";
    pos=str_komm.find("\r\n");
    str_komm.replace(pos,2,br);//<<<<-----O.G. Fehler
    

    Mondmann



  • Ja das sollte so stimmen.

    Aber ausgehend von meinem letzten Posting stelle ich mir hier die Frage ob man pos nicht vielleicht doch auf string::npos überprüfen sollte 😃 (sprich: Hat find überhaupt was gefunden? Wenn nicht, kann auch nichts ersetzt werden)



  • Wie hast du diesen String denn eingelesen? Die Methoden der fstream's (und auch die FILE*-Funktionen) sind so clever, die Kombination "\r\n" zu einem einfachen "\n" zu verkürzen - so daß dein gesuchter Zeilenumbruch gar nicht mehr so im String stehen dürfte.

    (zur Kontrolle: Gib den String mal zeichenweise aus und schau dir an, was übriggeblieben ist. Und wie LordJaxom schon sagte, achte auf den Rückgabewert von find())



  • STOP!
    Kommando zurück. Ich hab meinen Fehler!
    Ich prüfe ja, ob die Zeichen \r\n vorhanden sind, teste aber nicht ob sie NICHT vorhanden sind...ich denke brauche nicht weiterreden....im Falle die Zeichen sind nicht vorhanden, hat die variable pos einen bel. Wert und dann krachts....

    Grüße Mondmann



  • Mondmann schrieb:

    im Falle die Zeichen sind nicht vorhanden, hat die variable pos einen bel. Wert und dann krachts....

    Nein, beliebig ist der Wert nicht. find() gibt den definierten Wert std::string::npos (=(size_t)-1) zurück - und der liegt außerhalb des legalen Index-Bereiches.



  • Ok alles klar.

    Gibts auch eine Funktion, mit der man ALLE Vorkommen gleichzeitig ersetzen kann?
    In dem String kann das \r\n (wird übrigens nicht mit \n ersetzt) 0-20mal vorkommen und jedesmal muss ich es ersetzen.

    Grüße Mondmann



  • Im Standard gibt's das nicht, aber das kannst du leicht selber schreiben - oder du schaust in meinen Artikel "Stringverarbeitung in C++" (Kapitel 2.3), dort findest du eine passende Funktion.



  • Ok.
    Geschrieben habe ich das schon, hat mich nur interessiert obs da noch was "fertiges" gibt...
    Danke und Grüße Mondmann


Anmelden zum Antworten