String nach einem bestimmten String ersetzen



  • Hallo Zusammen,

    ich wollte in einem CString einen Teilstring der nach einem anderen bestimmten Teilstring vorkommt ersetzen. Dabei ist nur der erste Teilstring bekannt.

    Hier ist ein Beispiel:

    CString = _T("Die Oma geht bei Carl Mueller einkaufen.");
    

    Nun will ich Mueller durch Beispielsweise "Hansen" ersetzen, so dass der folgende CString entsteht:

    CString = _T("Die Oma geht bei Carl Hansen einkaufen.");
    

    Dabei soll nur der Teilstring Mueller ersetzt (Replace) werden, jedoch wissen wir vorher nicht dass dort Mueller steht, sondern wir wissen nur dass es das Wort ist das nach Carl kommt.
    Danke euch,

    Tanja



  • Standardfrage, wieso nutzt du nicht std::string?



  • @out: Sorry, ist halt so.



  • Gehört das nicht eher in die MFC-Sektion? Hat ja nicht viel mit normalem C++ zu tun.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum MFC (Visual C++) verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Sofern der CString von MFC keine überraschende "ersetze das Wort nach dem Wort"-Funktion mitbringt, so muss man sich das eben selber programmieren. Dazu zur Verfügung stehen, egal ob CString, C-String, std::string oder jede beliebige andere Art von Zeichenkettenbehandlung, die Grundmittel Suchen und Ersetzen. Und damit wird die Aufgabe einigermaßen ekelig, wenn man alle Fälle bedenkt. Es gibt auch viele Fragen in der Art von "Wird 'Carl Carl Mueller' zu 'Carl Hansen Mueller', 'Carl Hansen Hansen' oder 'Carl Carl Hansen'?", die mit den gegebenen Informationen gar nicht beantwortbar sind. Hier eine Implementierung mittels std::string. Für den CString müssen die Such- und Ersetzfunktionen entsprechend angepasst werden (Die Funktionalität sollte bereits vorhanden sein, sie heißt bloß anders):

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    
    void replace_after_word(string &str, const string &search, const string&replace)
    {
      static const char whitespace[]=" \n\t\b\v\f";
    
      // Suche nach nächstem Vorkommen:
      for (size_t pos = str.find(search, 0);
           pos != string::npos;
           pos = str.find(search, pos + 1)) 
        {
          if (pos + search.length() < str.length()    // Wir sind noch nicht am Ende
              and isspace(str[pos + search.length()]) // und es ist ein ganzes Wort
              and (pos == 0 or isspace(str[pos - 1])))
           {
              // Suche Anfang des nächsten Wortes:
              size_t next_begin = str.find_first_not_of(whitespace, pos+search.length());
              if (next_begin != string::npos)
                {
                  // Suche Ende des nächsten Wortes:
                  size_t next_end = str.find_first_of(whitespace, next_begin);
                  if (next_end == string::npos) next_end = str.length();
                  // Ermittele Länge des zu ersetzenden Wortes:
                  size_t length = next_end - next_begin;
                  // Nehme die Ersetzung vor:
                  str.replace(next_begin, length, replace);
                  // Weiter geht es hinter dem ersetzten Wort:
                  pos = next_begin + replace.length();
                }
            }
        }
    }
    
    int main()
    {
      string einfach = "Die Oma geht bei Carl Mueller einkaufen.\n";
      replace_after_word(einfach, "Carl", "Hansen");
      cout << einfach;
      string schwierig = "Carlchen Mueller HusCarl Mueller Carl Mueller";
      replace_after_word(schwierig, "Carl", "Hansen");
      cout << schwierig << '\n';
      string auch_schwierig = "Carl Mueller Carl Carl Mueller Carl\n";
      replace_after_word(auch_schwierig, "Carl", "Hansen");
      cout << auch_schwierig;
    }
    

    Hier habe ich die erwähnten unbeantwortbaren Fragen eigenständig so umgesetzt, wie es mir sinnvoll erschien. Ausgabe ist hier:

    Die Oma geht bei Carl Hansen einkaufen.
    Carlchen Mueller HusCarl Mueller Carl Hansen
    Carl Hansen Carl Hansen Mueller Carl
    

  • Mod

    Schau Dir CString::Find, CString::SpanExcluding, CString::Delete, CString::Insert an.



  • Aber SpanExcluding nimmt mir doch den ersten Teil nur. Die zweite Hälfte muss ich ja am Ende auch noch hinzufügen, oder?



  • und Danke für eure Beiträge nochmal. 🙂



  • Hi,

    du sucht erst deinen TeilString :

    CString str("eins zwei drei vier fünf");
    
    int pos(str.Find("vier"));
    
    if(pos != -1) //found
    {
       str.Replace(pos,"sechs");
    }
    
    //Oder aber gleich
    
    str.Replace("vier","sechs");
    
    //usw..
    

    Ergebnis : "eins zwei drei sechs fünf"

    Ps. CString ist gut, warum Frager sind immer irritierte ohne Inhalt.

    Grüße
    K.


Log in to reply