字符串 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
我玩了字符串函数,我写了下面这个,显然我设置了 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