Benutzer-Werkzeuge

Webseiten-Werkzeuge


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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki