2013-08-03 135 views
2

我有一個函數像這樣的正常工作:添加一個字符陣列到另一個使用指針

char* add(char* origText, char* paste) 
{ 
    char* pointerToOrigText = origText; 
    while (*pointerToOrigText!='\0') 
     pointerToOrigText++; 
    while (*paste!='\0') 
     *pointerToOrigText++=*paste++; 
    *pointerToOrigText='\0'; 
} 

示例:origText = 「ABC」,糊= 「DEF」 功能之後:origText = 「ABCDEF」 ,paste =「def」

所以我把兩個字符串合併成一個。但是,使用此功能時:

char* add (char* origText,char *paste) 
{ 
    int newLength = strlen(origText) + strlen(paste)+ 1; // + '\0' 
    char* newText = new char[newLength]; // we want to make sure that 2 strings will fit. 

    char* pointerToNewText = newText; // pointer to char array where we will merge strings 
    char* helpPointer = origText; // helps us count until '\0' 

    while (*helpPointer!='\0') 
    { 
     *pointerToNewText=*helpPointer; 
     *pointerToNewText++; *helpPointer++; 
    } 

    while (*paste!='\0') 
    { 
     *pointerToNewText=*paste; 
     *pointerToNewText++; *paste++; 
    } 

    *pointerToNewText='\0'; 

    origText = newText; 

    // cout <<origText<<endl; 
} 

外功能輸出是: origText = 「ABC」,貼= 「高清」 功能之後:origText = 「ABC」,貼= 「高清」

我我的書解釋說,這是因爲這條線:

char* newText = new char[newLength]; 

但我不明白。爲什麼在函數中分配內存會影響指針origText。

+1

我希望你在origText中有足夠的內存,否則你會損壞內存。 – xanatos

+5

請使用'std :: string'。您的整個函數定義可以使用它在單行中編寫。如果你的書推薦了你寫的方式,那麼選一本好書。 – Mahesh

+1

@Mahesh +1這本書在很多層次上看起來不對 – stijn

回答

4

在函數內部,origText是一個單獨的變量,以傳遞進來的。所以你對它做的任何事情(如origText = newText)將會影響調用者的變量而不是

相反,函數看起來像它應該指針返回新的字符串:

char* // That's the function's return type: it must return that 
add(const char* origText, // Added const: the function doesn't change this string 
    const char* paste) // And again 
{ 
    // Your code (with a bit more const), followed by 
    return newText; 
} 

現在,當你調用函數,你可以使用它的返回值:

const char* origText = "abc"; 
const char* paste = "def"; 

char* newText = add(origText, paste); 

std::cout << origText << std::endl; // abc - unchanged 
std::cout << paste << std::endl; // def - unchanged 
std::cout << newText << std::endl; // abcdef - result of concatenation 

delete [] newText; // Don't forget to delete whatever you create with new. 

一旦你明白了所有這些討厭的記憶管理如何工作,你應該學會使用std::string類來爲你做所有事情:

std::string origText = "abc"; 
std::string paste = "def"; 
std::string newText = origText + paste; // Does exactly what you think it does. 
1

* pointerToNewText ++; * helpPointer ++;

* pointerToNewText ++; *粘貼++; // 錯誤。只有指針指向的值才增加。

origText = newText; // 沒用。

你應該使用下面的代碼:

char* add (char* origText,char *paste) 
{ 
    int newLength = strlen(origText) + strlen(paste)+ 1; // + '\0' 
    char* newText = new char[newLength]; // we want to make sure that 2 strings will fit. 

    char* pointerToNewText = newText; // pointer to char array where we will merge strings 
    char* helpPointer = origText; // helps us count until '\0' 

    while (*helpPointer!='\0') 
    { 
     *pointerToNewText=*helpPointer; 
     pointerToNewText++; helpPointer++; 
    } 

    while (*paste!='\0') 
    { 
     *pointerToNewText=*paste; 
     pointerToNewText++; paste++; 
    } 

    *pointerToNewText='\0'; 

    return newText ; 
} 
1
在你的代碼

字符串的地址是按值傳遞給origText,所以它是一個局部變量。行origText = newText;不會改變外部的真實指針。你必須改變由指針傳遞給原來的指針,或使用通過引用傳遞

char* add (char** origText,char *paste) 

*origText = newText; 

char* add (char*& origText,char *paste) 

origText = newText; 

而且,您的代碼不返回任何

0

爲什麼在函數中分配內存會影響指針origText。

您的版本函數只是將額外的文本添加到原始字符串上,覆蓋原始字符串後存儲在內存中的任何內容。如果沒有重要的東西,那可能會好起來,或者它可能導致崩潰或者造成安全問題。正確的解決方案是分配一個足夠大的新內存來容納新的組合字符串並在那裏複製兩個字符串。

相關問題