Mehrere wörter in einem String verändern...

blotte

Mitglied
Hallo Zusammen,

vll kann mir jemand bei einem Problem helfen...:

Es soll ein Text eingelesen werden(text)...dann kann man ein Wort auswählen(findString) und dieses durch in anderes wort ersetzen(replace String)...

Problem: kommt das ausgewählte Wort (findString) öfter als ein Mal vor, so wird nur das erste geändert.... hier mei bisheriger quellcode...vll kann mir jemand helfen

Vielen Dank im Voraus...

Code:
cout << "Bitte geben Sie einen Txt ein: " ;
           getline(cin, text);

          
	   cout << "Welches Wort moechten sie aendern? " << endl;
  
	   getline(cin, findString);
           // liefert Position, ansonsten string::npos, wenn nicht gefunden
           iPos = text.find( findString, 0);

           cout << "Welches Wort soll stattdessen eingefuegt werden? " << endl;
	   getline(cin, replaceString);	 
     
		 //boolean wortErsetzen() {
         
		 //for ( l = 0; l <= text.length(); l++) {

             do {

			 if( text.find( findString, 0) != string::npos) {
				 text = text.replace( iPos, findString.length(), replaceString);
				 cout << "Der veraenderte String sieht nun so aus: "<< text<<endl;
				 break;
				 }
			 else{
				 cout<< "Das gesuchte wort gibt es nicht" <<endl;
				 return false;
				 
				 
			 }
		 		 }while( true );
			 
			 
			 
			 return 0;
		 
	 }
 
Wie schauts denn aus wenn du das true aus der schleife gegen eine Variable des Typ bool tauscht z.B. bool gefunden =true;
in dem if Zweig in dem du nun den String tauscht setzt du "gefunden" auf true, dadurch wird die Schleife wiedeholt, in dem else setzt du "gefunden" auf false und die Schleife wird nicht weiter durchlaufen.

Code:
          bool gefunden=true;
          do {

			 if( text.find( findString, 0) != string::npos) {
				 text = text.replace( iPos, findString.length(), replaceString);
				 cout << "Der veraenderte String sieht nun so aus: "<< text<<endl;
				 gefunden=true;
				 }
			 else{
				 cout<< "Das gesuchte wort gibt es nicht" <<endl;
				 gefunden=false;
				 
				 
			 }
		 		 }while( gefunden);

Solgane er jetzt einen String zum austauschen findet durchläuft er die Schleife. Wenn nichts mehr da ist was er austauschen soll, wird die Schleife beendet.

Hoffe ich konnte dir helfen.

mfg

Smurfy
 
Zuletzt bearbeitet:
...Ne, so läuft es auch nicht besser...ich habe das gefühl, dass die schleife nicht mehrmals durchlaufen wird

ich hab mein programm nochmal ein wenig umgestellt:

Code:
bool gefunden = true;
         
		 //for ( l = 0; l <= text.length(); l++) {

             do {
				 iPos = text.find( findString, 0);
				 sNeu = text.replace( iPos, findString.length(), replaceString);
				 sNeu = text;

			 if( text.find( findString, 0) != string::npos) {
				 
				 cout << "Der veraenderte String sieht nun so aus: "<< text <<endl;
				 gefunden = true ;
				 break;
				 }
			 else{
				 cout<< "Das gesuchte wort gibt es nicht" <<endl;
				 gefunden = false;
				 
				 //return true;
			     }
		 	 }while( gefunden );
			 
			  cout << "Der veraenderte String sieht nun so aus: "<< text <<endl;
			 
			 return 0;
 
Hallo,
dein Code funktionierte deswegen nicht weil du gleich beim ersten Treffer
mit deiner Schleife abbrichst.

Deinen Code etwas verändert koennte es so gehen:
C++:
#include <iostream>
#include <string>

using namespace std;

int main(){
    string text = "";
    string findString = "";
    string replaceString = "";
    int repetition = 0;
    string::size_type iPos = 0;
    cout << "Bitte geben Sie einen Text ein: " ;
    getline(cin, text);
    cout << "Welches Wort moechten sie aendern? ";
    getline(cin, findString);
    cout << "Welches Wort soll stattdessen eingefuegt werden? ";
    getline(cin, replaceString);
    while((iPos = text.find( findString, iPos++)) != string::npos){
        text = text.replace( iPos, findString.length(), replaceString);
        repetition++;
    }
    if(repetition)
        cout << "Der veraenderte String sieht nun so aus: "<< text<<endl;
    else
        cout<< "Das gesuchte wort gibt es nicht" <<endl;
    return 0;
}

P.S. Ein Debugger hilft bei sowas manchmal Wunder ;)

Gruß,

RedWing
 
Zuletzt bearbeitet:
Zurück