2012-04-04 9 views
1

は、なぜこれが動作しません:strcpyのは、割り当てられた文字列をコピーしません

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

Hereがあります完全なコード

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

+0

あなたが見ているエラーを示しています**完全**、**短い**プログラムを作成してください。詳細はhttp://sscce.orgを参照してください。 –

+4

どちらの場合も、渡された文字列 'lit'の長さに配列のサイズを変更します。 'lit'は少なくとも4文字長であることを保証するものは何ですか? –

+0

@amit:標準では許可されていませんが、その機能を提供するコンパイラ拡張があります。 –

答えて

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があなたのクラスのメンバーであり、あなたが機能leng()\0を指すようにポインタstrを移動し、当然のことながら、あなたは、次の文でも出力されません。

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

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

さらに、 'String :: leng()'メソッドを 'const'にすると、クラス状態(' str'データメンバを含む)を変更しないという制約がより明白になります。 –

0

String::leng()を書くための別の方法:

int String::leng() 
{ 
    char *endPtr = str; 
    while(*endPtr) 
     endPtr++; 
    return endPtr - str; 
} 
関連する問題