Zeichen in einem String tauschen



  • Hi,

    Ich brauche Hilfe für eine funktion. Weiss nicht wie ich das machen kann.

    Ich habe einen String z.B. "Hallo.wie-geht.es_dir?"

    Jetzt möchte ich den String bereinigen. Also die Zeichen wie - . und _ möchte ich gegen ein leerschritt austauschen das es so aussieht. "Hallo wie geht es dir?"
    Wie kann ich sowas machen das ich den ganzen String durchgehe und bei bestimmten Zeichen dieses austauschen kann??? 😕



  • AnsiReplaceStr(const AnsiString AText, const AnsiString AFromText, const AnsiString AToText);
    


  • Hallo,

    geht auch so (verständlicher als ne Hilfe-Kopie)

    AnsiString derText = "Hallo_wie_geht.es.dir";
    derText = StringReplace(derText, "_", " ", TReplaceFlags() << rfReplaceAll << rfIgnoreCase);
    derText = StringReplace(derText, ".", " ", TReplaceFlags() << rfReplaceAll << rfIgnoreCase);
    derText = StringReplace(derText, SucheNach, Ersetzte, TReplaceFlags() << rfReplaceAll << rfIgnoreCase);
    

    gruß promicha



  • Da immer viele so versessen auf Beispielcode sind und sich über Hinweise auf die BCB-Hilfe und/oder die FAQ aufregen, so würde ich das machen. Dieser Code ist bestimmt um Klassen schneller als "tausend" StringReplace hintereinander 😉

    char *p;
    char c;
    AnsiString str;
    
    str="Hallo_wie_geht.es.dir";
    // str.Unique();
    for(p=str.c_str(); (c=*p)!=0; p++)
    {	if(c=='_' || c=='-' || c=='.')
    		*p=' ';
    }
    

    Der auskommentierte Befehl ( str.Unique(); ) sollte man sicherheitshalber einbauen wenn man mit Zeigern hantiert um eine Eindeutigkeit des Strings sicherzustellen 😉

    @junix, jansen, AndreasW ***blinzelundwink***



  • Vielen Dank an euch. Habe das von Peter genommen. Das konnte ich am besten verstehen. Funktioniert Super! 😃



  • Is aber Sch...ade! 😉
    Warum nicht einfach den []-Operator des AnsiString benutzen?

    for (int i = 1; i <= str.Length(); i++)
    {
      switch (str[i])
      {
        case '_' :
        case '-' :
        case '.' :
          str[i] = ' ';
          break;
        case '\\' :
          str[i] = '/';
      }
    }
    


  • Jansen schrieb:

    Is aber Sch...ade! 😉
    Warum nicht einfach den []-Operator des AnsiString benutzen?

    warum nicht beim standard bleiben ?

    std::string str = "hallo.da";
    for (int i=0;i<strlen(str.c_str());i++)
    {    switch (str[i])
        {
         case '_' :
         case '-' :
         case '.' :
               str[i] = ' ';
               break;
         case '\\' :
               str[i] = '/';
               break;
      }
    }
    


  • 1ntrud0r schrieb:

    warum nicht beim standard bleiben ?

    Weil die VCL-Klassen mit AnsiString statt mit std::string arbeiten?



  • Jansen schrieb:

    1ntrud0r schrieb:

    warum nicht beim standard bleiben ?

    Weil die VCL-Klassen mit AnsiString statt mit std::string arbeiten?

    tja wenn du dich dadrauf versteifst biste aber bei der portierbarkeit,wiederverwendbarkeit ziemlich arm dran ..



  • Wenn das dein Hauptkriterium ist dann dürftest du keine einzige VCL-Klasse verwenden. Tust du aber, oder nicht? 😉

    Warum sollte man z.B. den Text einer TStringList mit Dateipfaden erst in std::string wandeln, wenn man in diesen Pfaden Unterstriche durch Leerzeichen ersetzen will?


Anmelden zum Antworten