Tokenize oder alternative?



  • Hi, ich dachte mir es wäre gut Tokenize auf einen CString anzuwenden,
    aber wie ich jetzt sehe, wird quasi jedes Zeichen als "Trenner" verwendet.

    CString Inhalt = "abc-test<br>Hello<br>Welt!";
    
    resToken=inhalt.Tokenize("<br>",curPos);
    

    Ich wollte als Ergebnis folgendes erhalten:
    abc-test, Hello und Welt.

    Das <br> war also als Trennzeichen gedacht.
    Ich sehe jetzt aber, dass mir "a", "c-test", "Hello" und Welt
    zurückgegeben werden.
    Er trennt also bei jedem Zeichen ("<" oder "b" oder "r" oder ">") den String ab.

    Kann man Tokenize hier irgendwie austricksen, oder muss ich meine Funktionen
    überdenken?


  • Mod

    Nimm doch einfach CString::Find...
    So schwer ist es auch nicht dann eine Schleife zu bauen.

    Oder (wenn Du zu faul bist es selbst zu schreiben und Performance keine Rolle spielt) nimm CString:Replace... tausche <br> in \t und nimm dann Tokenize...



  • Nötigenfalls schreibst du dir einfach einen eigenen Tokenizer. Ist wirklich einfach, wenn man weiß was zu tun ist. Auf Basis von std::string oder char* geht das recht fix. Eine ordentliche ANSI-C-Implementierung dürfte sogar relativ schnell sein.



  • ...



  • Eines der Nachteile von MFC, das Teil wird nicht gut weiterentwickelt. Ergebnis: man muss sich vieles selber zusammenbauen bzw. andere Bibliotheken einbinden.
    Bei anderen Toolkits (Qt, wx) werden auch solche Standard-Klassen wie String immer wieder um neue Funktionen ergänzt. Die String-Klasse hat bei Qt Funktionen wie ::split und ::join, die auch so funktionieren, wie der Threadersteller das will und noch viel mehr. MS hat CString doch bestimmt 20 Jahre unverändert so belassen.

    Nun zum Problem 🙄
    Google mal nach: cstring tokenize codeproject
    Da wirst du Lösungen finden...


  • Mod

    Softwaremaker schrieb:

    MS hat CString doch bestimmt 20 Jahre unverändert so belassen.

    Nein! CString wurde gravierend umgebaut von einer normalen Klasse auf ein Template. Ich glaube das war in VC-2005. Hier wurden auch Funktionen erweitert und viel standardisiert.

    Aber seit dem ist glaube ich nichts mehr an CString passiert.



  • Hallo,

    mach mal so:

    #define SPLIT "<br>";
    
      CString txt("111111<br>2222222<br>333333<br>444444"),sub;
    
      for(int i=0; AfxExtractSubString(sub,txtitem,i,SPLIT); i++)
      {
       sub.Replace(SPLIT,"");
    
       TRACE("%s\r\n",sub);
      }
    

Anmelden zum Antworten