字符串 Rev 函数,越界异常的奇怪行为 (c++)

String Rev function, strange behavior for out of bounds exception (c++)

我玩了字符串函数,我写了下面这个,显然我设置了 ret 字符串中的第一个字符要写在越界的地方,但是我没有异常,而是得到了一个字符串那有一个额外的地方。

std::string StringManipulations::rev(std::string s)
{
    
    std::string ret(s.size(), ' ');

    for (int i = 0; i < s.size(); i++)
    {
        std::string ch;
        ch.push_back(s[i]);
        int place = s.size() -i;
        ret.replace(place,1,ch);
    }
    return ret; 
}

我写错了一个位置,这个位置对应的地方比我在函数开头分配的原始字符串大小大一个。

为什么我们没有收到错误消息?

s = StringManipulations::rev("abcde");
    std::cout << s.size();
    std::cout << s;

output is : 6 _edcba 

有帮助吗?

已解决:将 ch 添加为字符串会自动添加一个空终止符,这样我们就可以得到一个 size+1 的新字符串。

C++ 有一个零开销规则。 这意味着不应无意中执行任何开销(如检查索引是否在边界内)。 你不会得到异常,因为 c++ 根本不验证索引是否有效。

对于额外的字符,这可能与(常规)c 字符串有关。 在 c 中,字符串是没有定义大小的 char (char*) 类型的数组。 字符串的结尾用 null terminator 表示。 C++ 字符串是向后兼容的,这意味着它们也有空终止符。 您可能将终止符替换为其他字符,但下一个字节也是零,这意味着您又添加了一个字符。

除了上面关于空终止符的信息外,您问题的另一个答案是文档说它只会在位置大于字符串大小时抛出,而不是超出字符串的末尾。 string replace api