[string] Leerzeichen abschneiden



  • Hi,

    da die Foren-Suche nichts ergeben hat, diese alltäglich Frage:
    Wie schneide ich bei einem String die Leerzeichen vorn und hinten ab?

    Bisher mache ich das folgendermaßen:

    string tmp;
    getline(file, tmp);
    
    string::iterator it = tmp.begin();
    string::size_type count = 0;
    while (it!=tmp.end() && isspace(*it))
    {
    	++it;
    	++count;
    }
    tmp.erase(0, count);
    
    string::reverse_iterator rev_it = tmp.rbegin();
    count = 0;
    while (rev_it!=tmp.rend() && isspace(*rev_it))
    {
    	++rev_it;
    	++count;
    }
    tmp.erase(tmp.size()-count, string::npos);
    

    Geht das besser?

    Grüße,
    don_basto.

    //EDIT: Kode debuggt 😉



  • Ich würd aus dem ganzen noch eine Templatefunktion machen.





  • Hallo,
    die boost-Variante ist sicher die sinnvollste, wenn man sowieso schon boost verwenden.

    Händisch kann man es z.B. auch so machen:

    void trimA(std::string& s) {
    	typedef int (*Sig)(int);
    	s.erase(s.begin(), std::find_if(s.begin(), s.end(), not1(ptr_fun(static_cast<Sig>(isspace)))));
    	s.erase(std::find_if(s.rbegin(), s.rend(), not1(ptr_fun(static_cast<Sig>(isspace)))).base(), s.end());
    }
    

    Das ist aber unter Umständen nicht ganz korrekt (siehe char vs. unsigned cahr vs. int Problematik).
    Besser also:

    struct IsSpace : std::unary_function<char, bool> {
    	bool operator()(char c) const {
    		return isspace(static_cast<unsigned char>(c)) != 0;
    	}
    };
    
    void trim(std::string& s) {
    	s.erase(s.begin(), std::find_if(s.begin(), s.end(), not1(IsSpace())));
    	s.erase(std::find_if(s.rbegin(), s.rend(), not1(IsSpace())).base(), s.end());
    }
    


  • mit boost::algorithm::trim



  • und was ist mit tabulatoren?

    also folgender string:

    "\t \t hallo welt\t \t \t "

    würde das damit etwa klappen? Also die trim funktion aus PHP frisst alles 😃



  • +++++++++++ schrieb:

    und was ist mit tabulatoren?

    also folgender string:

    "\t \t hallo welt\t \t \t "

    würde das damit etwa klappen? Also die trim funktion aus PHP frisst alles 😃

    Wie wär's wenn du's einfach ausprobierst? Klar, ist ein völlig unintuitives Konzept, erspart dir aber wenigstens den Blick in die Doku....


Anmelden zum Antworten