C++ Code Snippet - In-Place and String-Copy Space Trimming of STL Strings
Posted on 2007-05-30 17:28 by Timo Bingmann at Permlink with 1 Comments. Tags: #c++ #code-snippet
Yesterday I once again stumbled upon whitespace trimming of STL strings: a check was required if the given user input is empty. Where "empty" also means some user-given string containing only spaces. After one hour of unproductive searching for something as simple as a space trimming function, I decided to put the resulting code here for future reference.
The following code snippet contains two versions of the function: in-place trimming and string-copy trimming. I prefer the copy-trimming function because they allow a more functional programming style. The functions only trim spaces, but can be modified by replacing each ' ' with something like " \n\r\t".
#include <string> static inline void string_trim_left_inplace(std::string &str) { str.erase(0, str.find_first_not_of(' ')); } static inline void string_trim_right_inplace(std::string &str) { str.erase(str.find_last_not_of(' ') + 1, std::string::npos); } static inline std::string string_trim_left(const std::string &str) { std::string::size_type pos = str.find_first_not_of(' '); if (pos == std::string::npos) return std::string(); return str.substr(pos, std::string::npos); } static inline std::string string_trim_right(const std::string &str) { std::string::size_type pos = str.find_last_not_of(' '); if (pos == std::string::npos) return std::string(); return str.substr(0, pos + 1); } static inline std::string string_trim(const std::string& str) { std::string::size_type pos1 = str.find_first_not_of(' '); if (pos1 == std::string::npos) return std::string(); std::string::size_type pos2 = str.find_last_not_of(' '); if (pos2 == std::string::npos) return std::string(); return str.substr(pos1 == std::string::npos ? 0 : pos1, pos2 == std::string::npos ? (str.length() - 1) : (pos2 - pos1 + 1)); } static inline void string_trim_inplace(std::string& str) { std::string::size_type pos = str.find_last_not_of(' '); if(pos != std::string::npos) { str.erase(pos + 1); pos = str.find_first_not_of(' '); if(pos != std::string::npos) str.erase(0, pos); } else str.erase(str.begin(), str.end()); }