2016-02-29 52 views
1

我一直在試圖寫一個函數的自定義字符串類的一部分(學而不依靠的std :: string來創建自己的字符串類),但我不明白出了什麼問題。C風格的字符串查找和替換功能

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; 
} 

每次我運行這不僅不會導致期望的字符串,但我得到一堆堆腐敗消息。

字符串是「幫助,我是毛蟲!!」我想用「鳥」代替「毛毛蟲」,字符串變成「幫助,caterpibird !!」然後用我前面提到的錯誤信息退出。

我在這裏做錯了什麼?

+3

'的strcpy(newString,m_string)'複製老的字符串到新的緩衝區,但新的緩衝區不夠大(因爲當'replaceString'比'subString','offset'是負數短) 。你在分配之外摧毀了內存。 –

回答

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()荷蘭國際集團目前,長串,到新的,更短的緩衝。

緩衝區溢出。堆腐敗。未定義的行爲。