1

これが機能しない理由:

SomeClass::SomeClass(char *lit) //Ctor
{
    str = new char[strlen(lit)+1]; // str is a pointer to char in SomeClass
    strcpy(str,"have");
    cout << str << " " << "In Ctor" << " +Size=" << strlen(str)<< endl;
}

上記のコードは、長さが 0 の文字列を示しています。しかし、このコードは機能します。

SomeClass::SomeClass(char *lit)
{
    char newstr[strlen(lit)+1];
    strcpy(newstr,"have");
    cout << newstr << " " << "In Ctor" << " +Size=" << strlen(newstr)<< endl;
}

これが完全なコードです。

編集:
質問に答えた後にOPが削除したIdeoneへのリンクを追加しました。
ソース コードへのリンクがなければ、この Q&A は役に立ちません。

4

2 に答える 2

4

に問題はありませんstrcpy。ポインターをいじっているだけです。

問題はここにあります:

 str = new char[strlen(lit)+1];
 strcpy(str,lit);
 length=leng();    <------------- str points to \0 after this call
 cout << str << " " << "In Ctor" << " +Size=" << strlen(lit)<< endl;

strはあなたのクラスメンバーであり、関数内のを指すようにポインターstrを移動します。当然、次のステートメントには出力が表示されません。\0leng()

解決策は、関数内の別のポインターに開始アドレスを保持することです。

int String :: leng()
{
      int length=0;
      char *tempPtr= str;       <----------- Store the address in a temporary pointer
      while(*str)
      {
                 length++;
                 str++;
      }
      str = tempPtr;            <---------- Point the Pointer member to right address again
      return length;
}
于 2012-04-04T15:29:05.970 に答える
0

別の書き方String::leng():

int String::leng()
{
    char *endPtr = str;
    while(*endPtr)
        endPtr++;
    return endPtr - str;
}
于 2012-04-04T23:41:35.627 に答える