string finden und ersetzen geht nicht

uzo

Grünschnabel
string finden und ersetzen geht nicht, bitte um hilfe echt dringend

Hallo..kann mir bitte jemand helfen und sagen was an dieser funktion nicht stimmt...er macht jedenfalls keine ausgabe vom ersetzen und das "programm" beleibt hängen
Code:
string ersetze (string s, string u, string z)
	{
	string::size_type i;
    while ((i=s.find(u)) != string::npos)  // solange wort in s vorkommt
    s.replace (i, u.size(), z);                // durch Ersatzwort ersetzen
    return s;
	}

hier der ganze code
Code:
#include <iostream>
#include <string>
#include <fstream>


using namespace std;
   


string Orginal[6]={"die","der","ist","ich","Du","Dir"};
string Ersatz[6]={"ersatzdie","ersatzder","ersatzist","ersatzich","ersatzDu","ersatzDir"};

string ersetze (string s, string u, string z);
	

   int main()
   {
    	
    string Zeile,nichtenthalten,enthalten,ersatz; 
	int i=0,e=0,o=0;
      
	ifstream datei("Eingabe.txt");  // Eingabestrom fin definieren und ver-
          // binden mit Datei, deren Name in der Stringvariablen Datei steht
      if (!datei)                                // Das hat nicht funktioniert
      {  cout << "Datei existiert nicht!" <<endl;
         exit(1);
      }
   
      //cin.ignore (80, '\n');          // evtl. Überbleibsel in cin entfernen
      //cout << "Bitte die verbotene Zeichenkette eingeben.\n";
      //string Unwort;
      //getline (cin, Unwort);
         
      while ( getline(datei, Zeile) )                  // nächste Zeile lesen
      {
	  
	  
	    
		  for (i=0;i<6;i++)
		  {
		  if (Zeile.find(Orginal[i])==string::npos)     // Wort nicht enthalten
          o=1;
		  }
		  
		  
		  for (i=0;i<6;i++)
		  {
		  if (Zeile.find(Orginal[i])!=string::npos)                                 // zensierte Zeile ausgeben:
           enthalten=Orginal[i];
		   ersatz=Ersatz[i];
		   cout<<"";
		   e=1;
		  }

		  
		  if (o=1)
		  {
		  cout << Zeile << endl;// Zeile ausgeben
		  o=0;
		  }
		  
		  if (e=1)
		  {
		  cout << ersetze (Zeile, enthalten, ersatz) << endl;
		  e=0;
		  }
      }
      datei.close();
	  
	  
	
   return 0;
	
   }

   string ersetze (string s, string u, string z)
	{
	string::size_type i;
    while ((i=s.find(u)) != string::npos)  // solange wort in s vorkommt
    s.replace (i, u.size(), z);                // durch Ersatzwort ersetzen
    return s;
	}
 
Zuletzt bearbeitet:
Hallo also erstmal zu deinem Problem:

Ich denke das das daran liegt das du in der Funktion ersetze eine
Endlosschleife produziert.
Du produzierst zum Beispiel bei dem ersatz mit dem Wert "ersatzDir"
und dem zu Ersetzenden mit dem Wert "Dir" rekursiv eine immer
längere Kette mit dem Wert:
ersatzersatzersatzersatz.....Dir.
Und das wird dir nicht nur bei den zwei Wörteren passieren sondern
bei allen deiner definierten Werte...
Also entweder du solltest dir andre Werte für den Ersatz ausdenken
oder deine Funktion umschreiben, weil so wird das nix ;)

Ach nochwas:
Bitte versuch dir mal anzugewöhnen sagende Namen für Variablen
zu verwenden, ansonsten wirst dus bei grßeren Programmen
irgendwann nimmer lesen können.


//edit Nochn tip:
Wenn du auf Optimierung stehst kannst du deine Funktion auch so
definieren:
Code:
void ersetze (string& s, const string& u, const string& z)
	{
	string::size_type i;
    while ((i=s.find(u)) != string::npos)  // solange wort in s vorkommt
    s.replace (i, u.size(), z);                // durch Ersatzwort ersetzen
	}
Dann sparst du dir erstens den returnwert (wegen call by reference)
und zweitens werden nur die Referenzen übergeben anstatt jedesmal
die kompletten String Objekte

Gruß

RedWing
 
Zuletzt bearbeitet:
kannst du es näher erläutern wie ich die funktionumschreiben könnte..ich weis echt nicht mehr weiter
 
Mhm die Werte kannst du nicht ändern?

Ansonsten würde ich erst den Wert "Dir" rauslöschen mit und dann
den Wert "ersatzDir" einfach inserten...
Wenn du noch fragen hast frag ruhig...

//edit Wichtig: Du musst erst ALLE "Dir" rauslöschen und dann dir die
stellen merken. Und dann ERST wenn alle raus sind "ersatzDir" an den
entsprechenden stellen inserten.
Gruß

RedWing
 
Zuletzt bearbeitet:
geil..es geht wie ich es gehabt hab...nur anstatt dem while einfach ein if

nur das problem ist, dass er jede zeile in der er nichts ersetzt 2 mal ausgibt...di mit dem ersatzen sind in ordnung
 
uzo hat gesagt.:
geil..es geht wie ich es gehabt hab...nur anstatt dem while einfach ein if

nur das problem ist, dass er jede zeile in der er nichts ersetzt 2 mal ausgibt...di mit dem ersatzen sind in ordnung
Aber so wird doch die ersetzung nur einmal vorgenommen oder?
Was passiert wenn du den Begriff mehrmals in deinem String hast?

Gruß

RedWing
 
orginal

Kocht Bäuerin faule Eier,
kost der Bauer wie ein Reiher

Wird der Knecht gehetzt von Doggen,
muss er um sein Leben joggen.

Mischt der Bauer Gift zur Butter,
ist sie für die Schwiegermutter.

Flankenkicker Flick kickt flinke Flanken.
Flinke Flanken kickt Flankenkicker Flick

Dicke Nichten dichten im dichten Fichtendickicht.
Im dichten Fichtendickicht dichten dicke Nichten.

Unter einer Fichtenwurzel
hörte ich einen Wichtel furzen

Müde bin ich Känguruh,
mache meinen Beutel zu.
Lege beide Ohren an,
damit ich besser schlafen kann.




ausgabe:
Kocht Bäuerin faule Eier,
ersatzDirKocht Bäuerin faule Eier,
kost der Bauer wie ein Reiher
kost ersatzDir Bauer wie ein Reiher


Wird der Knecht gehetzt von Doggen,
Wird ersatzDir Knecht gehetzt von Doggen,
muss er um sein Leben joggen.
muss er um sein Leben joggen.


Mischt der Bauer Gift zur Butter,
Mischt ersatzDir Bauer Gift zur Butter,
ist sie für die Schwiegermutter.
ersatzDir sie für die Schwiegermutter.


Flankenkicker Flick kickt flinke Flanken.
Flankenkicker Flick kickt flinke Flanken.
Flinke Flanken kickt Flankenkicker Flick
Flinke Flanken kickt Flankenkicker Flick


Dicke Nichten dichten im dichten Fichtendickicht.
Dicke NersatzDirten dichten im dichten Fichtendickicht.
Im dichten Fichtendickicht dichten dicke Nichten.
Im dersatzDirten Fichtendickicht dichten dicke Nichten.


Unter einer Fichtenwurzel
Unter einer FersatzDirtenwurzel
hörte ich einen Wichtel furzen
hörte ersatzDir einen Wichtel furzen


Müde bin ich Känguruh,
Müde bin ersatzDir Känguruh,
mache meinen Beutel zu.
mache meinen Beutel zu.
Lege beide Ohren an,
Lege beide Ohren an,
damit ich besser schlafen kann.
damit ersatzDir besser schlafen kann.
 
RedWing hat gesagt.:
Mhm die Werte kannst du nicht ändern?

Ansonsten würde ich erst den Wert "Dir" rauslöschen mit und dann
den Wert "ersatzDir" einfach inserten...
Wenn du noch fragen hast frag ruhig...

//edit Wichtig: Du musst erst ALLE "Dir" rauslöschen und dann dir die
stellen merken. Und dann ERST wenn alle raus sind "ersatzDir" an den
entsprechenden stellen inserten.
Gruß

RedWing

Gruß

RedWing
 
Zurück