Std::string replace...wird die größe des Strings verändert?
-
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. FehlerMondmann
-
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