2013-05-03 115 views
1

我正在編寫自己的append函數,以便使用靜態字符緩衝區[50]在字符串數組1的另一個動態字符數組的末尾附加一個字符串數組2的動態字符數組。但是,編譯器會生成以下錯誤:[錯誤]將'char'賦值給'char [50]'時不兼容的類型。我試圖找出問題所在,但我似乎找不到解決方案。您的幫助將非常感激。我正在使用Dev-C++。代碼是波紋管。我的追加功能不能按預期工作。 C++

#include <iostream> 


using namespace std; 

char *Appendstring(char *a, char *b) // will append b to the end of a 
{ 
    static char buffer[50]; 
    char *p=buffer=*a++; //[Error] incompatible types in assignment of 'char' to 'char[50]' 
        //[Error] invalid conversion from 'char*' to 'char'[-fpermissive] 
    p--; 
    while(*p++=b++); 
    p--; //append 
    while(*p++=*c++); 
    return buffer; 


} 

int main() 
{ 

    string str="Displaying: "; 
    string add=" Summer is coming"; 

    Appendstring(str, add); 

    return 0; 
} 
+4

好的,但爲什麼不使用'運算符+ ='爲'std :: string's? – 2013-05-03 15:24:10

+0

重新實現字符串類及其成員是通過C或C++等低級語言學習自己的方式的常用方式。我沒有看到指出爲了解決問題而存在描述任務的操作員的相關性。 – 2013-05-03 15:40:59

回答

3

你的追加函數有多個錯誤,最大的是使用數組作爲指針,並使用靜態緩衝區來合併字符串。使用靜態緩衝區時,所有合併的字符串將位於同一空間中,因此合併兩個字符串,然後合併其他兩個字符串會覆蓋第一個合併的結果!

你可以改變你的功能如下:

char *Appendstring(const char *a, const char *b) // will append b to the end of a 
{ 
    char *buffer = new char[strlen(a)+strlen(b)+1]; 
    char *p=buffer; 
    while(*p++=*a++); // Copy a into buffer 
    while(*p++=*b++); // Copy b into buffer right after a 
    *p=0; // Null-terminate the string 
    return buffer; 
} 

當然,調用者負責釋放現在的Appendstring結果。

+0

噢,我修好了我所有的錯誤。代碼現在工作正常。謝謝!!! – T4000 2013-05-03 15:56:05

1

你不能分配到一個數組中,這是你在buffer=*a++中所做的。你的意思可能是

static char buffer[50]; 
char *p=buffer; 
*p=*a++; 

此外,這裏

p--; 
while(*p++=*b++); 

你試圖反引用指針一個元素前一個數組的開頭 - 這會導致不確定的行爲。

此外,你無處檢查字符串的長度,所以它可以很容易地更多的49在一起,你的代碼將是不正確的和不安全的(容易受到buffer overflow攻擊)。

最後一個問題是,由於使用了static數組,因此您的代碼無論如何都不可重入。你可以簡單地使用簡單的數組,如果你不想調整它到字符串的長度,或者動態分配它,就像這裏所建議的那樣。

當然最好的解決方案是使用std::string並忘記所有這些問題。