::tolower 使用 std::transform

Xig*_*gma 3 c++ transform std tolower

为什么 std::transform 不能以这种方式工作:

std::string tmp = "WELCOME";
std::string out = "";
std::transform(tmp.begin(), tmp.end(), out.begin(), ::tolower);
Run Code Online (Sandbox Code Playgroud)

出来是空的!

但这有效:

std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
Run Code Online (Sandbox Code Playgroud)

我不希望转变就地发生。

Sta*_*nny 5

您正在写入越界内存,因为 的范围out小于 的范围tmpout您可以通过应用来存储结果std::back_inserter

正如 user17732522 所指出的,由于获取标准库函数的地址是不合法的,所以最好传递一个std::tolower在需要时调用该字符的 lamda 对象。

std::transform(tmp.begin(), tmp.end(), std::back_inserter(out), [](auto c) {
    return std::tolower(static_cast<unsigned char>(c));
});
Run Code Online (Sandbox Code Playgroud)