gpt4 book ai didi

c++ - 使用 string.erase() 使字符串变长?

转载 作者:太空狗 更新时间:2023-10-29 23:31:06 26 4
gpt4 key购买 nike

我在调试错误的字符串修剪函数时意外遇到了这个问题,现在我想知道到底是什么导致了这种行为。

这是一个仅包含相关位的代码片段:

#include <iostream>
#include <string>
using namespace std;

void debug(string s) { cout << "Len: " << s.length() << "; Value: '" << s << "'" << endl; }

int main()
{
string str = "ABC";
debug(str);

str.erase( str.begin() + 4, str.end() ); // Magic!
debug(str):

return 0;
}

您会注意到删除函数采用的迭代器刚好在字符串末尾之后开始。这不是我遇到问题时使用的确切输入(它有一个 +1 会破坏空字符串),但它具有类似的效果。这是输出:

Len: 3; Value: 'ABC'
Len: 4; Value: 'ABC '

当我将 str.begin() + 4 更改为更大的值,例如 + 10 时,很明显我开始提取垃圾数据。

我的问题是:使用 erase() 函数如何最终使字符串比以前更长?另外,这只是运气,还是字符串末尾后的下一个字符总是空白?

最佳答案

string::erase() 具有以下前提条件:

  • 要求:first 和 last 是 *this 上的有效迭代器,定义范围 [first,last)

由于您的代码不符合这一点,因此它表现出未定义的行为。分析它为什么会破坏某些东西并没有太多意义 - 基本上 erase() 函数做出了一个不正确的假设。

但是如果您真的很好奇到底发生了什么,您至少需要指定您使用的是哪个工具链(因为 UB 因编译器和库的不同而有很大差异)。最简单的方法可能是仅在调试器中单步执行代码以查看其在这种情况下的行为方式。

关于c++ - 使用 string.erase() 使字符串变长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com