char配列への文字列のコピーにはstrncpy_s()を使う

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()に変更しても問題なし。

参考:https://programming.pc-note.net/c/mojiretsu3.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です