0

プラス記号をオーバーロードして2つの文字列を連結しようとしていますが、エラーが発生し続けます。

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

今は動作します!みんなありがとう!

4

3 に答える 3

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

の 2 番目のパラメーターstrcat_sは、追加される文字列のサイズではなく、宛先バッファーのサイズです。したがって、それを次のように変更する必要があります

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

他の人がすでに指摘したように、残りの演算子 + 実装も壊れています。インスタンスを新しくしてから値で返すのはナンセンスです。スタックで結果をインスタンス化し、値で返すだけです。

于 2012-10-25T00:32:21.530 に答える
1

result.buf=new char[result.l+1];ヌル文字を許可する必要があります。

于 2012-10-24T23:24:19.810 に答える
1

operator+ では、変数 "MyString result" がスタックで宣言され、その後参照によって返されましたが、これは問題でした。

その後、OPが編集されました。変数 "result" はスタック上で宣言されなくなりましたが、代わりにヒープ上に割り当てられました。ただし、メモリ リークが発生しました。

ここで行うべき正しいことは、値で戻り、スタックで「MyString 結果」も宣言することです。また、コピー コンストラクターがあることを確認します。そして、そのためのデストラクタ。

また、コンストラクターが「const char*」を取るようにする必要があります。

于 2012-10-24T23:27:07.710 に答える