String Operationen....ist diese Aufgabe Lösbar?

Mollfred

Cadet 3rd Year
Registriert
Mai 2013
Beiträge
43
So ich hab mich heute daran gemacht mit String Operationen zu Arbeiten es geht darum in 3 Sätzen Bestimmte Wörter zu ersetzen.
Hier die Beispiele:
"Mein schwarzes Auto ist schoen". Soll zu "Mein Blaues Auto ist schoen" werden.

"Mein blaues Auto und Karins blaues Motorrad sind schoen." Soll zu "Mein schwarzes und Karins schwarzes Motorad sind schoen." werden.

Bis hier her hab ich kein Problem aber das dritte Beispiel lässt mich zweifeln ob man das überhaupt lösen kann, zumindest schein ich dafür den falschen Lösungsansatz zu verfolgen.... das Beispiel ist:
"Mein rotes Auto ist schoen." und das soll zu "Mein gruen-rotes Auto ist schön werden".
Was bei mir dazu führt das ich in meiner While Schleife in einen Endlos Loop gerate und das Programm hängen bleibt hier mein Code:
Code:
#include <iostream>
#include <string>
#include "stringOperations.h"
 
using namespace std;

int ersetzungen = 0;
void myreplace (string &text, const string &findString, const string &replaceString);
 
int replaceTest() 
{
    
	string text1 = "Mein schwarzes Auto ist schoen.";
   
    cout << "\nAlter Text: " << text1 << endl;
    myreplace(text1, "schwarzes", "blaues");    
    cout << "Neuer Text: " << text1 << endl;
	cout << "Wort Ersetzungen: " << ersetzungen << "\n"<<endl;

	string text2 = "Mein blaues Auto und Karins blaues Motorrad sind schoen.";
   
    cout << "Alter Text: " << text2 << endl;
    myreplace(text2, "blau", "schwarz");    
    cout << "Neuer Text: " << text2 << endl;
	cout << "Wort Ersetzungen: " << ersetzungen<< "\n" <<endl;

	string text3 = "Mein rotes Auto ist schoen.";
   
    cout << "Alter Text: " << text3 << endl;
    myreplace(text3, "rot", "gruen-rot");    
    cout << "Neuer Text: " << text3 << endl;
	cout << "Wort Ersetzungen: " << ersetzungen<< "\n" <<endl;


   

    return 0;
}
 
void myreplace( string &text, const string &findString, const string &replaceString ) 
{
    int x = 0;
	ersetzungen= 0;
	
    while( text.find( findString, x ) < text.length() )
     {
        text.replace( text.find( findString, x ), findString.length(), replaceString );
        x++; ersetzungen++;
     }
}

hat jemnd eine Idee wie ich das lösen könnte?
Das Problem ist ja das das gruen-rot, auch wieder ein rot speichert und ich deshalb die schleife weiter und weiter durch laufe....
 
Zuletzt bearbeitet:
Code:
void myreplace( string &text, const string &findString, const string &replaceString ) 
{
if(findString.empty())
        return;
    size_t start_pos = 0;
    while((start_pos = text.find(findString, start_pos)) != std::string::npos) {
        text.replace(start_pos, findString.length(), replaceString );
        start_pos += replaceString.length();
    }
}

in deinem fall gehst du rekursiv über den string oder?
 
Zuletzt bearbeitet:
Das Problem dürfte die Abbruchbedingung deiner while-Schleife sein:
Code:
while( text.find( findString, x ) < text.length() )
Wenn string::find nichts findet, gibt es -1 zurück (die Konstante string::npos). Das heißt, die Bedingung kann niemals erfüllt werden.
 
ah alles Klar danke für die erklärung ich werde mich noch mal ein bisschen über Schleifen schlau lesen und über size_t......ich hab jetzt die Lösung von DonnyDepp übernommen und es funktioniert, jetzt werd ich mich schlau lesen warum und wieso.....
Vielen Dank für die schnelle hilfe
 
ok danke für den hinweis...werd es mir anschauen
Ergänzung ()

RainbowSix5 schrieb:
Ganz einfach: statt nach "rot" zu suchen, was ja auch in grün-rot vorkommt suchst du nach " rot", also mit Leerzeichen davor
hmm ja das geht wirklich, aber scheint mir nicht wirklich sinn und zweck der Übung zu sein. Trotzdem Danke
 
NullPointer schrieb:
Das Problem dürfte die Abbruchbedingung deiner while-Schleife sein:
Code:
while( text.find( findString, x ) < text.length() )
Wenn string::find nichts findet, gibt es -1 zurück (die Konstante string::npos). Das heißt, die Bedingung kann niemals erfüllt werden.

std::string::npos ist vom typ std::string::size_type (bloß ein typedef für std::size_t) ... genau wie die Rückgabewerte von std::string::find() und von std::string::length(). size_t ist ein vorzeichenloser Typ. Das heißt, std::string::npos ist eigentlich der maximale Wert, den ein size_t haben kann. Damit wird die while-Schleife sehr wohl verlassen, wenn die Suche keinen Treffer ergibt.
Ergänzung ()

Mollfred schrieb:
Code:
void myreplace( string &text, const string &findString, const string &replaceString ) 
{
    int x = 0;
	ersetzungen= 0;
	
    while( text.find( findString, x ) < text.length() )
     {
        text.replace( text.find( findString, x ), findString.length(), replaceString );
        x++; ersetzungen++;
     }
}

Das Problem ist ja das das gruen-rot, auch wieder ein rot speichert und ich deshalb die schleife weiter und weiter durch laufe....

Entweder verstehe ich deinen Ansatz falsch, oder du hast die std::string::find()-Methode nicht korrekt verstanden. In der Aufrufform der Methode, die du verwendest, ist das 2. Argument der Index im String, an dem die Methode mit der Suche beginnen soll. Das heißt, du solltest nach deinem Suchwort suchen, die Ersetzung durchführen und dann erst HINTER der eben erfolgten Ersetzung mit der nächsten Suche weitermachen.
 
wie ist denn so mein stil her für nen anfänger schlecht oder geht?
 
Von dem, was ich hier gesehen habe, geht schon. Aber bleib auf jeden Fall von globalen Variablen weg; die machen nur Ärger. Prinzipiell solltest du immer versuchen, deinen Variablen den kleinst möglichen Gültigkeitsbereich zu geben. In deinem Beispiel gibt es für die globale Variable ersetzungen keinerlei Existenzberechtigung. Gib doch deiner myreplace()-Funktion einfach einen Rückgabewert, über den du die Anzahl der erfolgten Ersetzungen zurückgibst.
 
hmm ok das ist wirklich ein Ansatz über den ich mal nachdenken sollte, danke.
 
Zurück
Oben