EDIT c ++ 17'den beri, standart kitaplığın bazı bölümleri kaldırıldı. Neyse ki, c ++ 11 ile başlayarak, üstün bir çözüm olan lambdalarımız var.
#include <algorithm>
#include <cctype>
#include <locale>
// trim from start (in place)
static inline void ltrim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) {
return !std::isspace(ch);
}));
}
// trim from end (in place)
static inline void rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) {
return !std::isspace(ch);
}).base(), s.end());
}
// trim from both ends (in place)
static inline void trim(std::string &s) {
ltrim(s);
rtrim(s);
}
// trim from start (copying)
static inline std::string ltrim_copy(std::string s) {
ltrim(s);
return s;
}
// trim from end (copying)
static inline std::string rtrim_copy(std::string s) {
rtrim(s);
return s;
}
// trim from both ends (copying)
static inline std::string trim_copy(std::string s) {
trim(s);
return s;
}
Modern çözümü getirdiği için https://stackoverflow.com/a/44973498/524503'e teşekkürler .
Orijinal cevap:
Kırpma ihtiyaçlarım için şu 3'ten birini kullanma eğilimindeyim:
#include <algorithm>
#include <functional>
#include <cctype>
#include <locale>
// trim from start
static inline std::string <rim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(),
std::not1(std::ptr_fun<int, int>(std::isspace))));
return s;
}
// trim from end
static inline std::string &rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(),
std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
return s;
}
// trim from both ends
static inline std::string &trim(std::string &s) {
return ltrim(rtrim(s));
}
Oldukça açıklayıcıdırlar ve çok iyi çalışırlar.
EDIT : BTW, std::ptr_fun
orada yerelleştirmek std::isspace
destekleyen ikinci bir tanım var çünkü anlam ayrıştırmak için var. Bu aynı bir oyuncu olabilirdi, ama bunu daha çok sevme eğilimindeyim.
DÜZENLEME : Bir parametreyi başvuru ile kabul etme, değiştirme ve döndürme ile ilgili bazı yorumları ele almak için. Katılıyorum. Muhtemelen tercih edeceğim bir uygulama, biri yerinde diğeri kopya yapan iki işlev kümesi olacaktır. Daha iyi bir örnek:
#include <algorithm>
#include <functional>
#include <cctype>
#include <locale>
// trim from start (in place)
static inline void ltrim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(),
std::not1(std::ptr_fun<int, int>(std::isspace))));
}
// trim from end (in place)
static inline void rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(),
std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
}
// trim from both ends (in place)
static inline void trim(std::string &s) {
ltrim(s);
rtrim(s);
}
// trim from start (copying)
static inline std::string ltrim_copy(std::string s) {
ltrim(s);
return s;
}
// trim from end (copying)
static inline std::string rtrim_copy(std::string s) {
rtrim(s);
return s;
}
// trim from both ends (copying)
static inline std::string trim_copy(std::string s) {
trim(s);
return s;
}
Yukarıda verilen orijinal cevabı bağlam için ve yüksek oylanan cevabı hala mevcut tutmak adına saklıyorum.