Cでは、文字列のディープ コピーstrcpy
を作成していましたが、C++ で使用しても「問題ありません」か、代わりに使用すべきより良い代替手段がありますか?strcpy
4 に答える
これを上記のコメントに入れましたが、コードを読みやすくするためだけです:
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
C++ では、通常、char* の代わりに std::string クラスを使用するのが最も簡単な方法です。
#include <string>
...
std::string a = "Hello.";
std::string b;
b = a;
「b = a;」という行 通常 strcpy で行うのと同じことを行います。
C++ 文字列を使用している場合は、コピー コンストラクターを使用します。
std::string string_copy(original_string);
代入演算子の
string_copy = original_string
C スタイルの文字列 (つまり、null で終わる char 配列) を使用する必要がある場合は、strcpy を使用するか、より安全な代替手段として strncpy を使用してください。
strcpy_s を使用することをお勧めします。これは、destination および source 引数に加えて、オーバーフローを回避するために、destination バッファーのサイズを指定する追加の引数があるためです。ただし、文字配列/ポインターを使用している場合、これはおそらく文字列をコピーする最速の方法です。
例:
char *srcString = "abcd";
char destString[256];
strcpy_s(destString, 256, srcString);