You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::transform搭配::tolower时输出字符串为空?需非原地修改

std::transform结合::tolower转换字符串时输出为空的问题分析与解决

问题原因

  • 初始化的out是空字符串,out.begin()指向空容器的起始位置,没有足够内存容纳转换后的字符。std::transform仅会将结果写入迭代器指向的位置,不会自动为目标容器扩容,这属于未定义行为——表现为out始终为空,实际是写入了非法内存区域。
  • 原地修改时,tmp本身有与原字符串长度匹配的有效内存空间,tmp.begin()指向合法位置,转换后的字符能正常写入。

解决办法

有两种可靠的解决方案:

1. 提前为目标字符串分配内存

调用std::transform前,用resize将out的长度设置为与源字符串tmp一致:

std::string tmp = "WELCOME";
std::string out;
out.resize(tmp.size());
std::transform(tmp.begin(), tmp.end(), out.begin(), ::tolower);

2. 使用std::back_inserter自动扩容

std::back_inserter会调用容器的push_back方法,自动为out添加元素并扩容,需要包含<iterator>头文件:

#include <iterator>

std::string tmp = "WELCOME";
std::string out = "";
std::transform(tmp.begin(), tmp.end(), std::back_inserter(out), ::tolower);

额外提示:避免::tolower的潜在问题

::tolower要求输入为unsigned char类型,若原字符为负数(如部分扩展ASCII字符)会触发未定义行为,更安全的写法是用lambda包裹:

std::transform(tmp.begin(), tmp.end(), std::back_inserter(out), 
    [](unsigned char c) { return std::tolower(c); });

内容的提问来源于stack exchange,提问作者Xigma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:01:24