std::memmove()を使う方法もあるが、文字列の場合、コピー先の配列がゼロクリアされていないと、ヌル終端が付与されない。
strncpy_s()は環境依存ではあるが、使える環境であれば、これを使って文字列コピーした方がいい。
#include <stdio.h>
#include <string.h>
#include <iostream>
int main(void)
{
// ソースがchar配列の場合
char dst1[4]{'Z','Z','Z','Z'}; // ヌル終端付与の挙動をみるために、意図的に文字Zで埋める
char src1="abcdef";
strncpy_s(dst1, std::size(dst1), src1, std::size(dst1) - 1);
std::cout << dst1 << std::endl;
// ソースがstd::stringの場合
char dst2[4]{'Z','Z','Z','Z'}; // ヌル終端付与の挙動をみるために、意図的に文字Zで埋める
std::string src2="abcdef";
strncpy_s(dst2, std::size(dst2), src2.c_str(), std::size(dst2) - 1);
std::cout << dst2 << std::endl;
return 0;
}
実行結果 abc abc
こうすることで、ソースの文字列長に関わらず、コピー先の最後にヌル終端が挿入される。
std::size()はsizeof()に変更しても問題なし。
コメントを残す