trim() in c++ ?



  • Hi Leute!

    Ich kenn die Funktion aus php.

    Gibt es in c++ eine Funktion um einen String zu beschneiden? Sprich führende Leerzeichen zu entfernen?

    Danke.
    Johannes



  • ich kann dir leider nur sagen wie es gemacht wird wenn du mfc nutzt.

    CString deinString;

    und dann einfach nur deinString.TrimLeft()...
    so werden alle leerzeichen auf der linken seite gekillt.
    die funktion bietet noch mehrere möglichkeiten...
    kannst auch die entsprechenden parameter angeben.
    vll kanst ja was damit anfangen 😉

    greetz
    deflow



  • oder die STL-Variante:

    str.erase(0,str.find_first_not_of(" ")); //führende Leerzeichen entfernen
    str.erase(str.find_last_not_of(" ")+1);  //Leerzeichen am Ende entfernen
    
    //alternativ:
    pos1=str.find_first_not_of(" ");
    pos2=str.find_last_not_of(" ");
    str=str.substr(pos1,pos2-pos1+1);
    


  • const std::string trim( const std::string& s)
    {
      std::string::size_type first = s.find_first_not_of( ' ');
      if( first == std::string::npos) {
        return std::string();
      }
      else {
        std::string::size_type last = s.find_last_not_of( ' '); /// must succeed
        return s.substr( first, last - first + 1);
      }
    }
    


  • warum steht da must succeed??



  • cout << vec[ii].erase(0,str.find_first_not_of(" ")) << endl;
    

    Kann sein das das mit Vektoren in welchen ein String steht nicht geht?

    Danke.
    Johannes



  • y schrieb:

    warum steht da must succeed??

    Weil sonst der erste Fall greifen würde (first == std::string::npos).



  • @keboo: Klar geht das auch mit Strings, die in einem Container untergebracht sind. Allerdings bin ich mir nicht sicher, ob der Aufruf innerhalb der Ausgabeanweisung so sinnvoll ist.

    (und du mußt natürlich auf dem selben string suchen, den du zurechtschneiden willst ;))



  • Hier ist meine Version. Funktioniert für jeden Whitespace (genauso wie die PHP Variante):

    using namespace std;
    
    bool ctype_space(const char c)
    {
    	if(c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == 11)
    	{
    		return true;
    	}
    	return false;
    }
    
    string trim(string istring)
    {
    	bool trimmed = false;
    
    	if(ctype_space(istring[istring.length()-1]))
    	{
    		istring.erase(istring.length()-1);
    		trimmed = true;
    	}
    
    	if(ctype_space(istring[0]))
    	{
    		istring.erase(0,1);
    		trimmed = true;
    	}
    
    	if(trimmed == false)
    	{
    		return istring;
    	}
    	else
    	{
    		return trim(istring);
    	}
    }
    


  • Floele: Sieht ineffizient aus und nicht hübsch aus.

    Bei find_first_not_of/find_last_not_of kann man auch mehrere Characters angeben.



  • #include <iostream>
    #include <string>
    using namespace std;
    
    bool isWhitespace(const char c)
    {
    	return c==' ' || c=='\n' || c=='\t' || c=='\r' || c==11;
    }
    
    string trim(const string &s)
    {
    	int left=0, right=s.length()-1;
    
    	while(left<=right && isWhitespace(s[left]))
    		++left;
    
    	while(right>left && isWhitespace(s[right]))
    		--right;
    
    	return s.substr(left, 1+right-left);
    }
    


  • const std::string trim( const std::string& s)
    {
      std::string::size_type first = s.find_first_not_of(" \n\t\r");
      if( first == std::string::npos) {
        return std::string();
      }
      else {
        std::string::size_type last = s.find_last_not_of(" \n\t\r"); /// must succeed
        return s.substr( first, last - first + 1);
      }
    }
    

Anmelden zum Antworten