-1

誰かが次の何が問題なのか教えてもらえますか?

文字配列に文字を追加しようとしています。name は MyString クラスの文字配列へのポインタです。

void MyString::add_chars(char* c)
{
        if(l < strlen(c)+strlen(name))
                name = resize(name, l, sizeof(c));
        int i,j;
        for(i=0; i<strlen(c); i++) {
                name[i+l-1] = c[i];
                l++;
        }
}

char* MyString::resize(char* vptr, int currentsize, int extra) {
        char* temp = new char[currentsize + extra];
        int i;
        for (i = 0; i < currentsize; i++) {
                temp[i] = vptr[i];
        }
        vptr = temp;
        return vptr;
}

そして主に:

 MyString g ("and");
 g.add_chars("baasdf");
 cout << g.get_name() << "\n";

しかし、get_name は "andb" を返します。コードを修正するにはどうすればよいですか?

編集: コードを更新しても同じ結果..

void StringList::add_chars(char* c)
{
        char* my_new_string = resize(name, l, sizeof(char));
        if( my_new_string != NULL )
        {
                delete [] name;
                name = my_new_string;
        }
        int i,j;
        for(i=0; i<strlen(c); i++) {
                name[i+l-1] = c[i];
                l++;
        }
        name[l-1] = '\0';
}

char* StringList::resize(char* vptr, int currentsize, int extra) {
        char* temp = new char[currentsize + extra + 1];
        int i;
        for (i = 0; i < currentsize; i++) {
                temp[i] = vptr[i];
        }
        vptr = temp;
        return vptr;
}
4

3 に答える 3

1

この行は間違っています:

 name = resize(name, l, sizeof(c));

変数であるsizeof(char*)、を使用するべきではありませんが、実行するか、1だけを使用する必要があります。csizeof(char)

また、文字列の最後のゼロ終端を処理するために、サイズを+1するようにしてcharください。

于 2012-04-20T18:30:33.220 に答える
0

まず、これが「独自の文字列クラスを作成する方法」を学ぶための学習演習であると思いますか?C ++にはすでに組み込みの文字列型があり、ほとんどの場合、これを常に優先する必要があります。

演算子は、sizeofオペランドのサイズ(バイト単位)を生成します。この場合、タイプはcchar*です。実際に求めているのはnullで終了する文字配列("C"文字列")の長さのようです。 -すでにstrlenを使用しているので、もう一度使用することをお勧めします(nullターミネータも考慮に入れて)

name = resize(name, l, strlen(c) + 1);

コードはメモリリークに悩まされているように見えることに注意してください。最初に存在していたものをすべてクリアせずに、名前変数に新しい値を割り当てています。

if(l < strlen(c)+strlen(name))
{
    char* my_new_string = resize(name, l, strlen(c));
    if( my_new_string != NULL )
    {
        delete [] name;
        name = my_new_string;
    }
}

編集:他の回答が指摘しているように、C++とを使用して解決できるコードにはまだ多くの間違いがありstringますvector

add_charsを実装する方法の1つを次に示します。

void MyString::add_chars(char* c)
{
    if( c != NULL && name != NULL )
    {
        size_t newlength = strlen(c) + strlen(name) + 1;
        char* newstring = new char[newlength];

        if( newstring != NULL )
        {
            size_t namelength = strlen(name);
            size_t remaining = newlength - namelength;

            strncpy( newstring, name, newlength );
            strncpy( &newstring[namelength] , c, remaining );

            delete [] name;
            name = newstring;
        }
    }
}
于 2012-04-20T18:29:40.613 に答える
0

コードを修正するにはどうすればよいですか?

修正しないでください。それを捨てて使用するvector<char>か、単にstring.

しかし、どうすればコードを修正できますか!?

わかりました、わかりました、これが方法です...

  1. たとえば、 this oneのような素敵なデバッガーを入手してください。
  2. 常に変数を調べて、期待する値と比較しながら、コードを注意深く調べてください。
  3. への呼び出しに到達したら、 (のパラメータに割り当てられた)resizeに注意してください。期待したものではないことに気付いたら、自問してみてください。 の目的は何ですか。そうすれば、その理由がわかります。sizeof(c)extraresizesizeof

ところで、これらすべてが原因でメモリ リークが発生し、パフォーマンスが非常に低下しますstrlen

于 2012-04-20T18:41:37.980 に答える