Probleme mit Strings - replace() und find()



  • Hallo zusammen.
    ich bin gerade dabei mit Referenzen und Zeigern zu üben und wollte eine Funktion schreiben die in einem String ein bestimmtes Wort sucht und dieses direkt ersetzt.

    Das Programm kompiliert und läuft, jedoch muss irgendwo ein Fehler bei der Erkennung des angegebenen Teilstrings sein.. Ich finde ihn zum.... nicht. Die Funktion läuft einmal durch und findet das gesuchte Wort nicht.

    int replaceAll(string&, string&, string&);
    
    int main()
    {
    	string text;
    	string gesucht;
    	string ersatz;
    
    	cout << "Einen String durchsuchen und veraendern!" << endl;
    
    	cout << "Bitte einen String/Satz eingeben: "; getline(cin, text);
    
    	cout << "Nach welchem Wort suchen: "; cin >> gesucht;
    
    	cout << "Durch welches Wort ersetzen: "; cin >> ersatz;
    
    	cout << endl << "Das Wort wurde " << replaceAll(text, gesucht, ersatz) << "- mal gefunden und ersetzt!" << endl;
    	cout << "Der neue String: " << text << endl << endl;
    
    	return 0;
    }
    
    int replaceAll(string& t, string& g, string& e)		// da mit Referenzen gearbeitet wird kann der String direkt verändert werden
    {
    	int count{ 0 };
    	int pos{ 0 };
    	bool fertig = false;
    	int laenge = e.length();
    
    	do
    	{
    		fertig = true;
    
    		if (t.find(g))
    		{
    			pos = t.find(g);
    			fertig = false;
    			t.replace(pos, laenge, e);
    			count++;
    		}
    
    	} while (fertig == false);
    
    	return count;
    }
    

    Sicher ne blöde Kleinigkeit, aber Hilfe wäre nett 😉



  • Was gibt string::find zurück wenn der String nicht gefunden wurde?
    Welche Länge sollte an t.replace übergeben werden?



  • Deine ganze Schleife ist zu kompliziert und beim if prüfst du die falsche Bedingung
    laenge ist auch vom falschen String.

    while ((pos = t.find(g,pos)) >= 0) {
      t.replace(pos, laenge, e);
      count++;
    }
    


  • Danke!
    Den Fehler bei laenge hatte ich schon gefunden, die falsche Bedingung nicht.

    Das mit den komplizierten Schleifen/Anweisungen passiert mir noch relativ oft. Da muss ich noch dran arbeiten...



  • Noch etwas: Wenn dein Suchstring auch im Ersatzstring vorkommt, hast du eine Endlosschleife.



  • Wieso bekommt find() nochmal pos als zweites Argument übergeben? Bei mir im Buch steht da nichts von?



  • Damit beginnt die Suche nicht am String-Anfang, sondern erst an der Position pos ...



  • Feldscher schrieb:

    Wieso bekommt find() nochmal pos als zweites Argument übergeben? Bei mir im Buch steht da nichts von?

    In der Zeit, in der du die Frage gestellt hast, hättest du auch einfach mal nachgucken können, wofür dieser 2. ominöse Parameter gut ist. Die beiden Seiten, wo man eigentlich immer ne Antwort findet, sind
    http://www.cplusplus.com/reference/string/string/find/
    und http://en.cppreference.com/w/cpp/string/basic_string/find
    Wenn dazu im Buch nix steht, ist entweder das Buch schlecht oder der Autor wollte die Funktion bewusst vereinfachen.



  • Sorry,
    aber mein Beispiel ändert nichts an der Endlosschleife, da ja ab dem Anfang der Ersatzstelle gesucht wird.
    Aber jetzt kennst du ja den Parameter und kannst ihn sinnvoll einsetzen.


Anmelden zum Antworten