c++ - 字符串 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++ 有一个零开销规则。这意味着不应无意执行任何开销(例如检查索引是否在边界内)。您不会得到异常,因为 c++ 根本不验证索引是否有效。
对于额外的字符,这可能与(常规)c 字符串有关。在 c 中,字符串是没有定义大小的 char (char*) 类型的数组。字符串的结尾用空终止符表示。C++ 字符串是向后兼容的,这意味着它们也有一个空终止符。您可能将终止符替换为其他字符,但下一个字节也是零,这意味着您又添加了一个字符。
推荐阅读
- r - 使用R中的“openxl”将数据添加到excel文件中的新工作表
- c# - 覆盖 AspNetCore.Identity 表中的默认索引
- android - 回到 com.android.incallui 中的活动 InCallActivity
- excel - 向下拖动到相邻行时对值或单元格引用进行硬编码
- angular-material - 从 angular5 的按钮列表中禁用垫子按钮
- laravel - 我可以通过选项数组在 if 语句中进行比较吗
- oracle - 选择数字范围不重叠的位置
- jenkins - Jenkins 管道中的列表和并行任务
- python - 如何在不创建列表的情况下调用生成器?
- jenkins - 为什么这个命令在 Jenkins 中不起作用?