0

クラスがあります

class Cow{
    char name[20];
    char* hobby;
    double weight;
public:
    [..]
    Cow & operator=(const Cow &c);
    [..]
};

operator=そして、メソッドの定義をどのように書くのか疑問に思っています。-に等しい定義を書きました

Cow & Cow::operator=(const Cow &c){
    if(this==&c)
        return *this;
    delete [] hobby;
    hobby=new char [strlen(c.hobby)+1];
    weight=c.weight;
    strncpy(name,c.name,20);
    return *this;
}

しかし、「Philip Maciejowsky」のような名前[20]がすでに作成されていて、私がそれに「Adam」と言ったらどうなるでしょうか。operator =(...)の後、名前は「adamlipMaciejowsky」に等しくなりますか?そのように上書きされた場合の修正方法は?

4

2 に答える 2

1

を使用した後にヌル ターミネータを使用strcpy()または追加しますstrncpy()。はヌル ターミネータ ( ) をstrncpy()追加しませんが、追加します。\0strcpy()

私のアドバイス: null で終わる文字列std::stringの代わりに使用してください。c-styled

ローマにいるときは、ローマ人をやってください!


http://cplusplus.comから

source が >num よりも長い場合、destination の最後に null 文字は暗黙的に追加されません (したがって、この場合、destination は null で終了する C 文字列ではない可能性があります)。

は-Adamよりも長さが短いため、 は残りの宛先 (つまり) を で埋めません。したがって、出力は次のようになります。Philip Maciejowskystrncpy()Philip Maciejowsky\0

Adamip Maciejowsky-strcpy()または実行memset(destination, 0, lengthOfDestination)してから呼び出すstrncpy()と、出力もAdam同様になります。あなたがやろうとしていることをするための複数の方法。

于 2013-03-08T23:23:27.287 に答える
0

まず、C++ を使用している場合は、C スタイルの文字列を使用するべきではなく、代わりに std::string クラスを使用する必要があります。これにより、あらゆる点ですべてが簡単になります。

char* 文字列を使用する必要があると仮定すると、strncpy がこれを処理します。C スタイルの文字列は null で終了します。つまり、 のような文字列"test"は 5 バイトを占めます。バイトは、順番に、{'t', 'e', 's', t', 0}. ゼロ (またはヌル) バイトは、文字列の末尾に到達したことを示すマーカーとして機能します。

私のシステムの strncpy のマンページから:

以下は、chararray を に設定しますabc\0\0\0

       char chararray[6];

       (void)strncpy(chararray, "abc", sizeof(chararray));

したがって、これは文字列にヌルバイトを表す"adam\0\0\0\0\0\0\0[etc.]"場所が含まれることを意味します。\0文字列関数は、最初の null を読み取った時点で処理を停止します (覚えておいてください、C スタイルの文字列では、文字列をスキャンして検索しない限り、文字列の長さを知る方法はありません\0)。

于 2013-03-08T23:24:04.667 に答える