2

文字列に対して _tcsncpy_s() を複数回使用すると、古い内容が上書きされますか? それとも、新しいコンテンツを作成してから、新しいコンテンツを指しますか? 簡単な例として、私が持っている場合:

    LPTSTR myString = new TCHAR[MAX_PATH];
    LPTSTR copiedString1 = "Hello";
    LPTSTR copiedString2 = "Rock";
    _tcsncpy_s(myString,MAX_PATH,copiedString1,5); //1
    //delete [] myString; //3
    //LPTSTR myString = new TCHAR[MAX_PATH]; //3
    _tcsncpy_s(myString,MAX_PATH,copiedString2,4); //2

1 でわかりました: myString があります --> 'H' 'e' 'l' 'l' 'o'

しかしポイント 2: 'R' 'o' 'c' 'k' は 'H' 'e' 'l' 'l' にコピーされますが、'o' は残りますか? それとも、メモリ内の新しい領域を指していますか? 3 のように myString を削除して再作成する必要がありますか? 最初に String2 をコピーし、次に String1 をコピーした場合はどうなりますか? 何か違うことはありますか?他に知っておくと役立つことはありますか?

お時間をいただきありがとうございます。良い一日をお過ごしください。

4

1 に答える 1

3

しかし、ポイント2では、「R」「o」「c」「k」は「H」「e」「l」「l」にコピーされますが、「o」は残りますか?

はい。ドキュメントを読む:

これらの関数は、strSourceの最初のD文字をstrDestにコピーしようとします。ここで、DはカウントとstrSourceの長さの小さい方です。それらのD文字がstrDest(サイズはnumberOfElementsとして指定されます)内に収まり、それでもnullターミネータの余地がある場合、それらの文字がコピーされ、終了nullが追加されます。それ以外の場合は、パラメーターの検証で説明されているように、strDest [0]がヌル文字に設定され、無効なパラメーターハンドラーが呼び出されます。

さて、あなたの他の質問のために:

それとも、メモリ内の新しい領域を指しているのでしょうか。

いいえ、mystringまだ同じ配列を参照しています。

3のようにmyStringを削除して再作成する必要がありますか?

多分。何をしたいかによります。両方の文字列のコピーが必要な場合は、はい、2つの文字配列(静的または動的)が必要になります。

最初にcopyString2をコピーし、次にcopyedString1をコピーした場合はどうなりますか?

その場合、あなたはRockあなたのストリングとして得るでしょう。

何か違うことが起こりますか?

操作の後に別の文字列が存在するmystringため、はい。

他に知っておくと便利なことはありますか?

これらの2つの文字列を連結しますか?その場合は、などの連結関数を使用してstrcatください。また、アンダースコアで始まる関数は非標準のベンダー固有の関数であるため、すべての確率で移植可能ではないことに注意してください。標準で定義された関数(、、など)を使用してみstrncpystrcatくださいstrncat

MSの世界で接頭辞付きの関数は、ほとんどの場合、プロジェクト設定(つまり、 /プリプロセッサマクロが定義されている_tかどうか)に応じて、それぞれの関数の適切なASCII/Unicodeバージョンに切り替わるマクロです。UNICODE_UNICODE

最後に、文字列のコピーと連結のバリエーションは、ソースからn最大で文字を読み取ります。nこの設計により、プログラマーは安全なコードを記述できます(したがって、バッファーオーバーフローを防ぐことができます)。

ああ、忘れる前に、C ++を使用している場合は、Cスタイルの文字列操作をすべて忘れて、より使いやすいstd::string(またはstd::wstring場合によっては)すっきりとした文字列操作に切り替える必要があります。文字列のコピーは単純な割り当て(つまり=、十分)を介して行われ、連結も同様に慣用的(つまり、+=十分)です。詳細については、ドキュメントを確認してください。

于 2012-05-23T19:54:10.310 に答える