Code: Select all
const std::string TrimString(const std::string& s)
{
const auto iter = std::find_if(s.cbegin(), s.cend(), [](auto c) -> bool { return !std::isspace(static_cast(c)); });
return iter != s.end() ?
std::string(iter, std::find_if(s.crbegin(), s.crend(), [](auto c) -> bool { return !std::isspace(static_cast(c)); }).base()) :
std::string();
}
//Usage
std::vector d{ 0xc5, 0xbc }; // example UTF-8 character
std::string uft8(d.begin(), d.end());
std::string trimmed = TrimString(utf);
Jetzt weiß ich, WARUM er abstürzt, und er ist leicht zu beheben, aber ich versuche, diesen Unterschied zu verstehen und sogar, was der Standard dazu sagt.
Der Grund für den Absturz ist, dass auf MSVC,
Code: Select all
std::isspaceOffensichtlich hat das mit auto als Parameter des Lambda zu tun. In MSVC ist der auto-Parameter des Lambda wahrscheinlich ein char, sodass jedes Byte um ein Vorzeichen erweitert wird, was den Absturz verursacht (da es sich um einen negativen Wert handelt). Ich bin mir nicht sicher, was im Fall von GCC passiert. Sicherlich würde dies auch etwas Ähnliches bewirken? Ist
Code: Select all
std::isspaceWie gesagt, es ist eine einfache Lösung, aber ich suche nach mehr Verständnis für den Unterschied zwischen MSVC und GCC in dieser Hinsicht.
Mobile version