2012-10-24 48 views
0

我想重載加號來連接兩個字符串,但我不斷收到錯誤。C++字符數組連接

VS 2010給出了一個斷言失敗消息: 「表達式:(L 」緩衝區太小「 & & 0)」; 文件: f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ tcscat_s.inl; 行: 42。

你認爲我的代碼有問題嗎?

#include "stdafx.h" 

class MyString{ 
    int l; // the length of the array pointed by buf 
    char *buf; //pointer to a char array 
public: 
     ... 
    MyString(char *); 
    friend MyString operator+(MyString &,MyString &); 
     ... 
}; 

MyString::MyString(char *p) 
{ 
    buf=new char[strlen(p)+1]; 
    strcpy_s(buf,strlen(p)+1,p); 
    l=strlen(p)+1; 
} 

MyString operator+(const MyString &a,const MyString &b) 
{ 
    MyString result(""); 
    result.l=a.l+b.l; 
    delete[] result.buf; 
    result.buf=new char[result.l+1]; 
    result.buf[0]='\0'; 
    strcat_s(result.buf,result.l+1,a.buf); 
    strcat_s(result.buf,result.l+1,b.buf); 
    return result; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyString a("hello"),b("world"),c(""); 
    c=a+b; 
    system("pause"); 
    return 0; 
} 

它現在工作!謝謝大家!

+0

爲什麼將result.buf中的第一個字符設置爲空字符? strcat_s可能認爲這是緩衝區的末尾。 – Alex

+0

,因爲strcat_s在串的末尾找到'\ 0'。 – Cristi

+0

此問題已被編輯,以包括被接受的答案提出的修正。這使得答案有些沒有意義。這對未來的讀者有什麼用處? – jogojapan

回答

1

在操作者+變量「MyString的結果」被宣佈在堆棧上,它隨後通過參考,這是不好的返回。

然後編輯OP。變量「結果」不再在堆棧中聲明,而是分配在堆上。然而,然後有一個內存泄漏。

在這裏做的正確的事情是值在堆棧上返回,並同時宣佈「MyString的結果」。還要確保你有一個拷貝構造函數。對於這個問題的破壞者。

你也應該讓你的構造需要「爲const char *」。

+0

你說的非常有趣,這就是我要做的,但是你知道'strcat_s(result- > buf,strlen(a.buf),a.buf);'? – Cristi

1

應該result.buf=new char[result.l+1];允許空字符。

+0

給出相同的斷言失敗的消息;我認爲a.buf結尾處的'\ 0'被b.buf中的第一個字符取代 – Cristi

2
strcat_s(result->buf,strlen(a.buf),a.buf); 
strcat_s(result->buf,strlen(b.buf),b.buf); 

strcat_s第二個參數是目標緩衝區的大小,而不是應被附加字符串的大小。 所以你需要改變,要

strcat_s(result->buf,result->l+1,a.buf); 
strcat_s(result->buf,result->l+1,b.buf); 

運營商+實現的其餘部分被打破,以及,如已經被別人注意。新增一個實例,然後按值返回是無稽之談。只需在堆棧中實例化結果並按值返回。