C++ String Aufgabe

ich habe eine Stringverarbeitungsaufgabe in C++ mit der ich nicht ganz zurecht komme.
Würde mich über Antworten/Erklärungen u Lösungsvorschläge/Korrekturen freuen.

Aufgabe:
Erstellen Sie eine Funktion einfuegen mit folg. Funktionsprototypen:
string einfuegen(string str1,string str2,string str3);

Die Funktion sucht im Str1 nach allen Stellen an denen der Teilstring str2 vorkommt und fügt direkt hinter jedem gefundenen str2 den str3 in str1 ein.Der Modifizierte String soll als Return Wert zurückgegeben werden.

Meine Lösung:

#include
#include
using namespace std;
string einfuegen(string str1,string str2,string str3)
{
string::size_type pos=0; //Anfangsposition
string str_mod; //mod. String Deklarierung

while(1)
{
pos=str1.find(str2);

if(pos==string::npos) //wenn kein str2
{
break;
}
else
{
str_mod=str1.insert(pos+str2.size(),str3); //str3 für str2 in str 1 einfuegen
}
pos++;
}
return str_mod;

}

Hauptfunktion:
Void Main()
{
string s1(„Hallo Frau Maier, Hallo Herr Maier“);
string s2(„Hallo“);
string s3(„Guten Tag“);

string str_mod;

str_mod=einfuegen(s1,s2,s3);

cout

Moin,

ich habe das nur mal in der Schnelle überflogen. Meine Antworten zwischen den Zeilen.

vor while(1) habe ich folgendes eingefügt:

str_mod=str1;

while(1)
{
pos=str1.find(str2);

^^ abändern in
pos=str_mod.find(str2,pos);

cout

Sorry, dass ich dir erst jetzt antworten kann.

Eine mögliche Lösung:

string &einfuegen(string &str_in, string &str_suche, string &str_einf)
{
if(str_in.empty() || str_suche.empty() || str_einf.empty()) // Prüfen, ob alle Strings gültig sind
return string("");
size_t letzte_pos = 0;
while((letzte_pos = str_in.find(str_suche, letzte_pos)) != string::npos) // Solange str_suche
// gefunden wird, dessen Position speichern und
{
str_in.insert(letzte_pos + str_suche.length(), str_einf); // hinter str_suche einfügen
letzte_pos++; // Position inkrementieren, damit der nächste Wert gefunden werden kann
}
return str_in; // str_in zurückgeben
}

int main(int argc, char argv[])
{
string s1(„Hallo Frau Maier, Hallo Herr Maier“);
string s2(„Hallo“);
string s3(" Guten Tag ");

einfuegen(s1, s2, s3);

cout

hi,

Ein paar wichtige Korrekturpunkte:
1.
Du suchst immer wieder vom Start des Strings ab; das gibt eine Endlosschleife
Ich glaube du wolltest ein str_mod.find(str2, pos) machen und hast das pos vergessen.

Statt das insert in str1 zu machen, solltest du mit str_mod eine Kopie von str1 anlegen und diese modifizieren, damit du sichergehst, dass deine Methode immer einen gültigen Rückgabewert besitzt.
Dann kannst du auch direkt str_mod.insert machen und musst nicht das Ergebnis (die Referenz auf den modifizieren String) in str_mod speichern.

nach den angegebenen Änderungen lief es bei mir einwandfrei.

Gruß, Hachi

Ich bin zwar die Programmierung unter .Net gewohnt (100% Objektorientiert), kann dir aber glaube ich trotzdem helfen.
Wenn ich das richtig sehe wolltest du mit der while-Schleife erreichen,dass solange str3 eingefügt wird, bis kein str2 ohne darauffolgenden st3 gefunden wird.
Ist dem so, wolltest du die Schleife mit der break-Anweisung beenden und Den neuen String an die main-Funktion zurückgeben.
Das Problem liegt nun darin, dass die return-Anweisung innerhalb der Schleife steht. Dadurch wird einmal nach dem str2 gesucht, str3 dahinter eingefügt und dann nicht die Schleife wieder von vorne durchlaufen, sondern der jetzt erstellte String sofort zurückgegeben und der Compiler kehrt wieder in die main-Funktion zurück. Du müsstest die Funktion mehrmals, jeweils mit dem bereits modifizierten String aufrufen, um dein Ziel zu erreichen. Oder du schreibst die return-Anweisung einfach erst nach der while-Schleife.
Ich hoffe ich konnte helfen!