String suchen und ersatzen 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 bleibt stehen

    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

    #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;
    	}
    


  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • uzo schrieb:

    Hallo..kann mir bitte jemand helfen und sagen was an dieser funktion nicht stimmt...er macht jedenfalls keine ausgabe vom ersetzen und das programm bleibt stehen

    Kein Wunder. Der Suchstring ist ja in dem String, mit dem du ersetzt, wieder enthalten und wird daher immer wieder gefunden. Du solltest hinter der letzten Teilersetzung weitersuchen, nicht wieder von Anfang an.



  • In Code heißt das:

    1. i mit 0 initialisieren
    2. in der While-Bedingung: i = s.find(u,i)

    Es wird dann ab dem alten i gesucht und dann i gleich neu gesetzt.
    Noch ne kleine Anmerkung: du solltest deinen Variablen ordentliche Namen geben. in Dreizeilern ist das zwar kein problem, aber wenn du in etwas rößeren blöcken mit irgendwelchen kryptischen Buchstabenkombinaionen und Einzelbuchstaben arbeitest, wird jede Codepflege zur Qual.



  • pumuckl schrieb:

    In Code heißt das:

    1. i mit 0 initialisieren
    2. in der While-Bedingung: i = s.find(u,i)

    Es wird dann ab dem alten i gesucht und dann i gleich neu gesetzt.

    Ja, aber immernoch auf den Anfang des ersetzten Wortes, so das es in diesem Fall wieder gefunden werden kann. Es fehlt noch:

    1. zuätzlich nach dem replace (Klammern fürs while nicht vergessen) i += z.size();


  • Crosspostings sind net so toll aber die Lösung wie sie hier genannt wurde ist besser. Du solltest auf die Variablennamen achten. Wenn du das Stück Code später nochmal anschaust wirst du nichts mehr verstehen.

    string StringReplace(string base, string const& seek, string const& replace)
    {
    	string::size_type strpos = 0;
        while ( ( strpos = base.find(seek, strpos) ) != string::npos )
    	{
    		base.replace (strpos, seek.size(), replace);
            strpos += replace.size();
    	}
        return base;
    }
    

    edit: natürlich replace.size() ich habs net getestet



  • Sollte sicher

    strpos += replace.size();
    

    sein. 😉



  • Außerdem solltest du die Zuweisungen in den if-Abfragen durch Vergleiche ersetzen.

    if (o=1)    // ist immer wahr, weil die Zuweisung immer erfolgreich ist
    {}
    
    if (o==1)   // das ist, was du willst (denk' ich)
    {}
    

    Gruß Mea


Anmelden zum Antworten