11

Cでは、文字列のディープ コピーstrcpyを作成していましたが、C++ で使用しても「問題ありません」か、代わりに使用すべきより良い代替手段がありますか?strcpy

4

4 に答える 4

20

これを上記のコメントに入れましたが、コードを読みやすくするためだけです:

std::string a = "Hello.";
std::string b;
b = a.c_str();   // makes an actual copy of the string
b = a;           // makes a copy of the pointer and increments the reference count

したがって、実際に の動作を模倣したい場合はstrcpy、 を使用してコピーする必要がありますc_str()

アップデート

C++11 標準は、以前の多くの実装で使用されていた一般的なコピー オン ライト パターンを明示的に禁止していることに注意してくださいstd::string。したがって、参照カウント文字列は許可されなくなり、次のようにコピーが作成されます。

std::string a = "Hello.";
std::string b;
b = a; // C++11 forces this to be a copy as well
于 2011-01-20T19:31:29.987 に答える
17

C++ では、通常、char* の代わりに std::string クラスを使用するのが最も簡単な方法です。

#include <string>
...
  std::string a = "Hello.";
  std::string b;
  b = a;

「b = a;」という行 通常 strcpy で行うのと同じことを行います。

于 2011-01-20T19:17:18.083 に答える
6

C++ 文字列を使用している場合は、コピー コンストラクターを使用します。

std::string string_copy(original_string);

代入演算子の

string_copy = original_string

C スタイルの文字列 (つまり、null で終わる char 配列) を使用する必要がある場合は、strcpy を使用するか、より安全な代替手段として strncpy を使用してください。

于 2011-01-20T19:20:07.943 に答える
3

strcpy_s を使用することをお勧めします。これは、destination および source 引数に加えて、オーバーフローを回避するために、destination バッファーのサイズを指定する追加の引数があるためです。ただし、文字配列/ポインターを使用している場合、これはおそらく文字列をコピーする最速の方法です。

例:

char *srcString = "abcd";
char destString[256];

strcpy_s(destString, 256, srcString);
于 2011-01-20T19:21:58.907 に答える