EDIT c ++ 17 के बाद से, मानक पुस्तकालय के कुछ हिस्सों को हटा दिया गया था। सौभाग्य से, c ++ 11 से शुरू होकर, हमारे पास लैम्ब्डा है जो एक बेहतर समाधान है।
#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;
}
आधुनिक समाधान लाने के लिए https://stackoverflow.com/a/44973498/524503 का धन्यवाद ।
मूल उत्तर:
मैं अपनी ट्रिमिंग आवश्यकताओं के लिए इन 3 में से एक का उपयोग करता हूं:
#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));
}
वे काफी आत्म व्याख्यात्मक हैं और बहुत अच्छी तरह से काम करते हैं।
संपादित करें : BTW, मैं std::ptr_fun
वहाँ में मदद करने के लिए है std::isspace
क्योंकि वहाँ वास्तव में एक दूसरी परिभाषा है जो स्थानों का समर्थन करता है। यह सिर्फ एक ही कास्ट हो सकता था, लेकिन मुझे यह पसंद है।
संपादित करें : संदर्भ द्वारा एक पैरामीटर को स्वीकार करने, संशोधित करने और इसे वापस करने के बारे में कुछ टिप्पणियों को संबोधित करने के लिए। मैं सहमत हूँ। एक कार्यान्वयन जिसे मैं पसंद करता हूं वह दो सेट कार्य करेगा, एक जगह के लिए और एक जो प्रतिलिपि बनाता है। उदाहरणों का एक बेहतर सेट होगा:
#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;
}
मैं मूल उत्तर को संदर्भ के लिए और उच्च मत वाले उत्तर को अभी भी उपलब्ध रखने के हित में रख रहा हूं।