edv:prg:cpp:example:stringutils
Stringutils
Helper rund um die Strings.
stringutils.h
#ifdef OS_WINDOWS #define STRING_COMPARE_IGNORE_CASE _stricmp #else #define STRING_COMPARE_IGNORE_CASE strcasecmp #endif // #ifdef OS_WINDOWS namespace utils { class stringutils // Helper rund um die Strings. { public: stringutils() = delete; ~stringutils() = delete; public: static const char* const WHITESPACE; static const char* const EMPTY; public: static const string::size_type npos; // Ersatz für "string::npos", welches wegen des DLL-Imports/Link-Problemen nicht verwendet werden kann. public: static std::vector<string> split_lines(const string &s); // Trennt den String nach Zeilen. static std::vector<string> split(const string &s, char delim, int count = INT_MAX); // Trennt den String nach dem Zeichen. static string trim(const string& s, const char* trimChars = nullptr); // Schneidet Leerzeichen links und rechts ab. static string trim_left(const string& s, const char* trimChars = nullptr); // Schneidet Leerzeichen links ab. static string trim_right(const string& s, const char* trimChars = nullptr); // Schneidet Leerzeichen rechts ab. static string pad_right(const string& s, char c); // Hängt ein Zeichen an, wenn es noch nicht vorhanden ist. static string pad_right(const string& s, size_t size, const char c = ' '); // Ergänzt fehlendes Padding. static string pad_left(const string& s, char c); // Ergänzt ein Zeichen links, wenn es noch nicht vorhanden ist. static string pad_left(const string& s, size_t size, const char c = ' '); // Ergänzt fehlendes Padding links. static string to_upper(const string &s); // Wandelt den String in Grossbuchstaben um. static string replace(const string &s, const string &old, const string &newText); // Ersetzt Teilstrings durch neue Strings. static int compare_nocase(const string &s1, const string &s2); private: static std::vector<string>& split(const string &s, char delim, std::vector<string> &elems, int count); static std::vector<string>& split_lines(const string &s, std::vector<string> &elems); }; // class stringutils // --- inlines --- inline std::vector<string> stringutils::split(const string &s, char delim, int count) { std::vector<string> elems; split(s, delim, elems, count); return elems; } // split() inline std::vector<string> stringutils::split_lines(const string &s) { std::vector<string> elems; split_lines(s, elems); return elems; } // split_lines() inline string stringutils::trim_left(const string& s, const char* trimChars) { size_t startpos = s.find_first_not_of(trimChars ? trimChars : WHITESPACE); return (startpos == string::npos) ? EMPTY : ((startpos == 0) ? s : s.substr(startpos)); } // trim_left() inline string stringutils::trim_right(const string& s, const char* trimChars) { size_t endpos = s.find_last_not_of(trimChars ? trimChars : WHITESPACE); return (endpos == string::npos) ? EMPTY : ((endpos == s.length() - 1) ? s : s.substr(0, endpos + 1)); } // trim_right() inline string stringutils::trim(const string& s, const char* trimChars) { size_t startpos = s.find_first_not_of(trimChars ? trimChars : WHITESPACE); if (startpos == string::npos) return EMPTY; size_t endpos = s.find_last_not_of(trimChars ? trimChars : WHITESPACE); if ((startpos == 0) && (endpos == s.length() - 1)) return s; return s.substr(startpos, endpos - startpos + 1); } // trim() inline string stringutils::pad_right(const string& s, char c) { if (s.empty()) return s; if (s[s.length() - 1] == c) return s; return s + c; } // pad_right() inline string stringutils::pad_right(const string& s, size_t size, char c) { if (s.length() >= size) return s; string ss = s; ss.resize(size, c); return ss; } // pad_right() inline string stringutils::pad_left(const string& s, char c) { if (s.empty()) return s; if (s[0] == c) return s; return c + s; } // pad_left() inline string stringutils::pad_left(const string& s, size_t size, char c) { if (s.length() >= size) return s; return string(size - s.length(), c) + s; } // pad_left() inline string stringutils::to_upper(const string &s) { string t = s; #ifdef OS_UNIX_AIX std::transform(t.begin(), t.end(), t.begin(), (int (*)(int))std::toupper); #else std::transform(t.begin(), t.end(), t.begin(), ::toupper); #endif return t; } // to_upper() inline int stringutils::compare_nocase(const string &s1, const string &s2) { return STRING_COMPARE_IGNORE_CASE(s1.c_str(), s2.c_str()); } // compare_nocase() } // namespace utils // EOF
stringutils.cpp
namespace utils { const char* const stringutils::WHITESPACE = " \n\r\t"; const char* const stringutils::EMPTY = ""; const string::size_type stringutils::npos = string::npos; std::vector<string>& stringutils::split(const string &s, char delim, std::vector<string> &elems, int count) { const char* current = s.c_str(); const char* to; int cnt = 0; while (current != nullptr) { ++cnt; if (cnt >= count) { to = nullptr; } else { to = strchr(current, delim); } if (to == nullptr) { elems.push_back(current); break; } elems.push_back(string(current, to)); current = to + 1; } return elems; } // split() std::vector<string>& stringutils::split_lines(const string &s, std::vector<string> &elems) { std::stringstream ss(s); string item; while (std::getline(ss, item)) elems.push_back(item); return elems; } // split_lines() string stringutils::replace(const string &s, const string &old, const string &newText) { string result = s; auto len = old.length(); auto pos = result.find(old); while (pos != string::npos) { result.replace(pos, len, newText); pos = result.find(old); } return result; } // replace() } // namespace utils // EOF
Stand: 30.10.2018
— : Jürgen Kreick
EOF
edv/prg/cpp/example/stringutils.txt · Zuletzt geändert: 2020/01/21 14:28 von 127.0.0.1