我一直在尝试将函数编写为自定义字符串类的一部分(学习创建自己的字符串类而不依赖于std :: string),但我无法弄清楚&#39错了。
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;
}
每次我运行它不仅不会产生预期的字符串,而且还会收到堆损坏消息。
字符串是&#34;帮助,我是毛毛虫!&#34;我想更换&#34; caterpillar&#34;用&#34; bird&#34;,字符串代替&#34;帮助,caterpibird !!&#34;然后退出我之前提到的错误消息。
我在这里做错了什么?
答案 0 :(得分:0)
int subStringIndex = FindSubstring(subString);
char* newString = new char[strlen(m_string) + offset + 1];
strcpy(newString, m_string);
这里至少有两个错误。
您的FindAndReplace()方法可以接收实际不存在的subString
。您的代码似乎无法处理这种情况。
然后第二个错误是replaceString
比subString
短,这是您的示例中的情况。分配了一个新的较小的newString
(因为offset
为负),比现有的m_string
短。
紧接着,您将当前较长的字符串strcpy()
放入新的较短的缓冲区中。
缓冲区溢出。堆腐败。未定义的行为。