EDIT Kể từ c ++ 17, một số phần của thư viện chuẩn đã bị xóa. May mắn thay, bắt đầu với c ++ 11, chúng tôi có lambdas là một giải pháp ưu việt.
#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;
}
Cảm ơn https://stackoverflow.com/a/44973498/524503 đã đưa ra giải pháp hiện đại.
Câu trả lời gốc:
Tôi có xu hướng sử dụng một trong 3 điều này cho nhu cầu cắt tỉa của mình:
#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));
}
Họ khá tự giải thích và làm việc rất tốt.
EDIT : BTW, tôi có std::ptr_fun
trong đó để giúp định hướng std::isspace
bởi vì thực sự có một định nghĩa thứ hai hỗ trợ các địa phương. Đây có thể là một diễn viên giống nhau, nhưng tôi có xu hướng thích điều này tốt hơn.
EDIT : Để giải quyết một số ý kiến về việc chấp nhận một tham số bằng cách tham chiếu, sửa đổi và trả lại nó. Tôi đồng ý. Một triển khai mà tôi có thể thích sẽ là hai bộ hàm, một bộ tại chỗ và một bộ tạo ra một bản sao. Một tập hợp các ví dụ tốt hơn sẽ là:
#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;
}
Tôi đang giữ câu trả lời ban đầu ở trên mặc dù cho bối cảnh và vì lợi ích của việc giữ câu trả lời được bình chọn cao vẫn có sẵn.