C风格的字符串查找和替换功能

时间:2016-02-29 02:02:32

标签: c++ string replace

我一直在尝试将函数编写为自定义字符串类的一部分(学习创建自己的字符串类而不依赖于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;然后退出我之前提到的错误消息。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

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()放入新的较短的缓冲区中。

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