2

char* 文字列のみを含む String オブジェクトを作成しました。メンバー。パラメーターのメンバーではなくオブジェクトからメンバーを両方とも char * 変数にコピーすることにより、operator+ をオーバーロードしています。しかし、なんらかの理由で、結果を印刷すると、約 16 個の意味不明な文字が追加されます (キャストのオーバーロードは 100% 正常です)。問題である char* sum = new char[length] に絞り込みました。strlen(sum) を確認したところ、6 文字の長さであるはずの 22 に等しいことがわかりました。誰が問題が何であるかの手がかりを持っていますか?

String String::operator+(const String& rhs)  
{
    int length = strlen(string) + strlen(rhs.string);
    char* sum = new char[length];
    for(int i=0;i<strlen(string);i++)
        sum[i] = string[i];
    for(int i=0;i<strlen(rhs.string);i++)
        sum[strlen(string) +i] = rhs.string[i];
    String s(sum);



    return s;

}

編集:意味不明なことはなくなりましたが、結果に = が追加されているため、たとえば、「1」+「2」+「3」は「1=2=3」になります。これは null ターミネータが間違って解釈された結果ですか?

もう一度編集してください。すばらしい回答をありがとうございます。

4

3 に答える 3

11

strlen文字列の先頭から、末尾の '\0' までの文字数を示します。新しい文字列を割り当てるときは、終端の `\0' のための余地を残しておく必要があります:

char *sum = new char[length + 1];

2 つの文字列をコピーした後に `\0' を追加します。

于 2013-09-03T13:48:35.923 に答える
7

'\0'終了文字にメモリを割り当てません。length+1連結にはバイトを割り当てる必要があります。また、設定する必要がありますsum[length] = '\0'

于 2013-09-03T13:47:47.460 に答える