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

基于范围的for循环遍历临时字符串时为何出现额外空字符?

核心原因

你存在一个认知偏差:第一段代码中范围for遍历的对象不是临时std::string,而是C风格字符串字面量"bar",它的原生类型是const char[4],本身就包含3个可见字符+末尾的\0空终止符,总长度为4。

范围for循环遍历原生数组时,会自动匹配数组的完整长度,遍历所有元素,因此会把末尾的\0也纳入遍历范围,写入到map中。

而第二段代码遍历的是std::string对象,std::string的迭代器范围[begin(), end())仅包含字符串的有效可见字符,不包含末尾隐式存储的空终止符,因此遍历不会出现\0。

如果要验证临时std::string的遍历行为,可以将第一段代码的循环修改为:

for (char c : std::string{"bar"}) m[c] = 0;

此时遍历的才是临时std::string,输出结果会和第二段代码完全一致,不会出现空字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:39:02