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()に変更しても問題なし。
コメントを残す