2016-01-06 23 views
-1

我有任務編寫一個函數char * stringReplace(const char * str, const char * what, const char * with),它用正確長度的新字符串替換帶有「with」的「what」。所以在函數內部我創建了函數返回的動態數組。但我的問題是如何刪除它後,因爲如果我試圖刪除它在主函數中,我使用它後,它說它是未定義的。不是沒有範圍的動態數組,或者我錯了? 這裏是我的代碼:用字符數組(字符串)代替C++

#include <iostream> 

#include <string.h> 

using namespace std; 

bool areTheSame(const char * str, const char * what, unsigned p) 
{ 


    return areEqual; 
} 


unsigned howManyTimes(const char * str, const char * what) 
{ 

} 


char * stringReplace(const char * str, const char * what, const char * with) 
{ 

} 

int main() 
{ 
    char str[1000]; 
    char what[1000]; 
    char with[1000]; 

    cout << "Enter your string\n"; 
    cin.getline(str, 1000); 

    cout << "\nEnter \"what\" you want to replace\n"; 
    cin.getline(what, 1000); 

    if (strlen(str) < strlen(what)) 
    { 
     cout << "\"What\" contains more characters than the string!\n"; 
     return 0; 
    } 

    cout << "\nEnter with what you want to replace it\n"; 
    cin.getline(with, 1000); 

    cout << "\nYour string with replaced words looks like\n"; 
    cout << stringReplace(str, what, with) << endl; 

    return 0; 
} 

PS我刪除部分代碼,因爲我發現我想要的答案,仍然有時間的任務,我不知道我被允許公開發布我的代碼

+2

什麼? ......... –

+0

嗯...我在主要功能中沒有看到任何「刪除」。如果將'stringReplace'的結果存儲在一個變量中,它應該可以工作,如果它是非空的,則可以使用'delete'。 – Sjlver

+0

在main()中,將'stringReplace(str,what,with)'的返回值放在char *類型的變量中。然後在cout後刪除[]。 – drescherjm

回答

0

您必須將其刪除才能避免內存泄漏。你可以做這樣的事情:

int main() 
{ 
    char str[1000]; 
    char what[1000]; 
    char with[1000]; 
    char *replaced; 

    cout << "Enter your string\n"; 
    cin.getline(str, 1000); 

    cout << "\nEnter \"what\" you want to replace\n"; 
    cin.getline(what, 1000); 

    if (strlen(str) < strlen(what)) 
    { 
     cout << "\"What\" contains more characters than the string!\n"; 
     return 0; 
    } 

    cout << "\nEnter with what you want to replace it\n"; 
    cin.getline(with, 1000); 

    cout << "\nYour string with replaced words looks like\n"; 
    replaced = stringReplace(str, what, with); 
    cout << replaced << endl; 
    delete [] replaced; 

    return 0; 
} 

但是請注意,這不是分裂分配/釋放的責任的最佳實踐。

+1

這是C++,而不是C,應該在第一次使用的地方聲明和初始化。 – Slava

+0

@Slava爲什麼要這樣呢?據我所知,這只是一個可讀性和慣例的問題。 – Rames

+1

,因爲可讀性不只是。這是編寫無錯代碼最重要的部分之一。 – Slava