gpt4 book ai didi

c++ - 我的函数操作 std::string 产生了意想不到的结果

转载 作者:太空宇宙 更新时间:2023-11-04 11:23:26 25 4
gpt4 key购买 nike

我正在尝试创建一个函数来查找子字符串的所有实例并将其替换为新字符串,但它似乎不起作用。这是代码:

#include <string>
#include <windows.h>
void ReplaceSubstr(std::string mainstring, std::string substring1, std::string substring2)
{
while (1)
{
int pos1 = mainstring.find (substring1);
if (pos1 == -1)
{
return;
}
mainstring.erase(pos1, substring1.size());
mainstring.insert(pos1, substring2);
MessageBox (NULL, "successfully ran", NULL, NULL);
}
}

int main()
{
std::string target = "this string needs fixing";
std::string bereplaced = "needs fixing";
std::string replacement = "is fixed";
ReplaceSubstr (target, bereplaced, replacement);
MessageBox (NULL, target.c_str(), NULL, NULL);
return 0;
}

2 MessageBox 在代码运行时出现,第一个带有文本“成功运行”,然后另一个带有文本“此字符串需要修复”。我期望的是第二个 MessageBox 显示为文本“this string is fixed”。

最佳答案

发布的代码有两个问题:

  • 调用 std::string::erase使所有迭代器无效,即一旦成员函数返回,就不能再使用 pos1(参见 this answer)。
  • 您通过 传递参数,因此任何修改仅反射(reflect)在本地临时拷贝中。

第一个问题特别令人讨厌,因为它似乎经常有效。但是,它仍然是未定义的行为,需要解决(通过使用返回有效迭代器的 std::string::erase 重载,或者改为调用 std::string::replace)。

第二个问题也可以通过两种方式解决,通过引用传递第一个参数,或者返回一个新的字符串对象。

解决方案可能如下所示:

std::string ReplaceSubstr( const std::string& input, const std::string& pattern,
const std::string& replacement ) {
std::string output{ input };
auto pos = output.find( pattern );
while ( pos != std::string::npos ) {
output.replace( pos, pattern.size(), replacement );
pos = output.find( pattern );
}
return output;
}

如果要就地执行替换,只需将返回类型更改为 void,将第一个参数替换为对非常量的引用,然后使用 input 对于所有出现的 output(减去最后的 return 语句)。

关于c++ - 我的函数操作 std::string 产生了意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27472063/

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