Problem bei String-Verarbeitung
-
Hallo erstmal,
da dies mein erster Beitrag hier ist hoffe ich einfach mal, dass ich mit meinem Problem hier in dem richtigen Forum bin. Und zwar befinde ich mich gerade in der Klausurvorbereitung für Informatik und habe ziemliche Probleme mit einer Aufgabe.Und zwar sollen wir einen Funktionsprototypen schreiben, der 3 Strings als Parameter übergeben bekommt, den ersten String (str1) nach dem zweiten (str2) durchsucht und dann den dritten (str3) hinter dem zweiten einfügt.
Ich habe mir natürlich auch Gedanken dazu gemacht und meine Lösungsidee sieht wie folgt aus:
void tauschen (string str1, string str2, string str3) { string::size_type pos =-1; do { pos++; pos = str1.find(str2, pos) + str2.size(); str1.insert(pos,str3); } while (pos!=string::npos); }Das Problem ist nun, dass wenn ich das ganze ausprobiere (mit Visual Studio 2005) die Konsole sich zwar öffnet und keine Fehler angezeigt werden, aber mit Ausnahme eines blinkenden "_" passiert nichts weiter. Ich vermute also, dass er in der Schleife feststeckt, habe aber ehrlich gesagt keine Ahnung warum. Ein ähnlicher Ansatz mit einer For-Schleife und replace-Funktion hat leider den gleichen Fehler gehabt.
Ich würd mich sehr freuen, falls jemand eventuell Ideen hat woran es liegen könnte.
Vielen Dank schon mal für die Hilfe
-
Der Fehler ist, daß du in der Variablen 'pos' schon gleich den Index des Endes speicherst, d.h. die while-Bedingung nicht erfüllt wird (falls string::find den String nicht mehr findet und string::npos zurückliefert).
Besser daher so:
void tauschen (string str1, string str2, string str3) { string::size_type pos = 0; while((pos = str1.find(str2, pos) != string::npos) { pos += str2.size(); str1.insert(pos, str3); pos += str3.size(); // <- zusätzlich noch pos um die Länge von str3 vergrößern, // damit nicht innerhalb von str3 weitergesucht wird } }(evtl. out-of-index Fehler habe ich hierbei noch nicht berücksichtigt!)
Du mußt jedoch bedenken, daß du bisher nur lokal den ersten String veränderst, d.h. entweder den neuen String als Rückgabe oder aber "string &" als Parameter verwenden (und für die anderen Parameter könntest du "const string &" nehmen).
-
Vielen Dank für die schnelle Hilfe!

Das ganze macht natürlich Sinn so wie du es erklärt hast.