gpt4 book ai didi

c++ - C 风格的字符串查找和替换函数

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

我一直在尝试编写一个函数作为自定义字符串类的一部分(学习在不依赖 std::string 的情况下创建我自己的字符串类),但我无法弄清楚哪里出了问题。

void String::FindAndReplace(const char* subString, const char* replaceString)
{
int offset = strlen(replaceString) - strlen(subString);

int subStringIndex = FindSubstring(subString);

char* newString = new char[strlen(m_string) + offset + 1];
strcpy(newString, m_string);

for (int i = subStringIndex + offset; i < strlen(newString); i++)
{
newString[i] = m_string[i - offset];
}

for (int i = subStringIndex; i < strlen(replaceString) + subStringIndex; i++)
{
newString[i] = replaceString[i - subStringIndex];
}

m_string = newString;
}

每次我运行它不仅不会产生预期的字符串,而且还会收到堆损坏消息。

字符串是“Help, I'm a caterpillar!!”我想用“bird”替换“caterpillar”,字符串变成“Help,caterpibird!!”然后退出并显示我之前提到的错误消息。

我在这里做错了什么?

最佳答案

int subStringIndex = FindSubstring(subString);

char* newString = new char[strlen(m_string) + offset + 1];
strcpy(newString, m_string);

这里至少有两个错误。

您的 FindAndReplace() 方法可以接收实际上并不存在的 subString。您的代码似乎无法处理这种情况。

第二个错误是当replaceStringsubString 短时,在您的示例中就是这种情况。一个新的、更小的 newString 被分配(因为 offset 是负数),比现有的 m_string 更短。

紧接着,您正在strcpy()将当前较长的字符串放入较短的新缓冲区中。

缓冲区溢出。堆腐败。未定义的行为。

关于c++ - C 风格的字符串查找和替换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35690813/

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