首页 > 解决方案 > 字符串 Rev 函数,越界异常的奇怪行为 (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 添加为 String 会自动添加一个空终止符,这样我们就可以得到一个 size+1 的新字符串。

标签: c++stringreplacereversestdstring

解决方案


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

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


推荐阅读