bessere trim funktion möglich ohne boost?



  • hi,

    gibt es noch ne bessere möglichkeit eine trimfunktion zu basteln als diese?

    std::string trim(std::string& s,const std::string& drop = " ")
    {
     std::string r=s.erase(s.find_last_not_of(drop)+1);
     return r.erase(0,r.find_first_not_of(drop));
    }
    

    mfg



  • Ich würd es so machen:

    std::string trim(const std::string& s,const std::string& drop = " ")
    {
     std::string::size_type first, last;
     first = s.find_first_not_of( drop );
     last = s.find_last_not_of(drop);
     return s.substr(first,last);
    }
    

    Ist wahrscheinlich nicht richtig so, allerdings hab ich die Funktionsweisen dieser Methoden nicht im Kopf.



  • Ist doch fast richtig, nur erase() erwartet die länge des Teilbereichs als zweiten Parameter:

    return s.substr(first,last-first);
    

    (und eventuell müsste man noch den Sonderfall 'leerer String' behandeln)



  • Hab gerade nach einer Trim-Funktion gesucht. Nur der Vollständigkeit halber, falls noch jemand danach sucht, hier eine erweiterte Lösung mit Beachtung leerer Strings:

    std::string trim(const std::string& s,const std::string& drop = " ")
    {
     std::string::size_type first = s.find_first_not_of( drop );
     std::string::size_type last  = s.find_last_not_of( drop );
    
     if( first == std::string::npos || last == std::string::npos ) return std::string( "" );
     return s.substr( first, last - first + 1 );
    }
    

    Gruß. mbu.



  • Hallo,

    kann mir jemand ein Beispielprogramm geben, wie die Funktion funktionieren soll?

    So funktioniert es wohl anscheindend nicht:

    int main()
    {
      std::string s1 = "Hallo, ich bin ein String! Trim me!";
      std::string s2 = trim(s1, "!");
    
      std::cout << s2 << std::endl;
    }
    

    Dann kommt nämlich sowas raus: "Hallo, ich bin ein String! Trim m".

    Danke,
    Markus



  • Stimmt doch 😉 "Trim" soll die Anfangssequenzen und Endsequenzen von dem übergebenen Token abschneiden. Benutzt man normalerweise, um führende und abschließende Leerzeichen/Tabs rauszuhauen.



  • Gut, ich hatte zwar nachgeschaut war trim heißt, allerdings war mir das "abschneiden" oder "richtig stellen" zu allgemein.

    Aber nun bin ich auch nicht mit dem Ergebnis zufrieden:

    int main()
    {
      std::string s1 = "   Hallo, ich bin ein String! Trim me!  ";
      std::string s2 = trim(s1);
    
      std::cout << s2 << std::endl;
    }
    

    Jetzt ist das Ergebnis "Hallo, ich bin ein String! Trim me". Ich denke, vielleicht muss last noch um den Wert eins addiert werden?

    Gruß
    Markus



  • lord.hong schrieb:

    Jetzt ist das Ergebnis "Hallo, ich bin ein String! Trim me". Ich denke, vielleicht muss bei last noch eins addiert werden?

    Schau mal in meinem letzten Beitrag. Hab ich eigentlich noch nachträglich eingetragen.



  • *lol* Dann war ich schneller als dein Nachtrag. 😉

    Dann hätte ich mir die Debbuging-Session auch sparen können. Allerdings hat es auch seinen Vorteil, nun verstehe ich im Detail was trim macht. Danke. 😃


Anmelden zum Antworten