cstring リテラル (または変数) を既存の std::array に直接書き込む方法はありますか?
つまり、私はこのようなことをしたい:
std::array<unsigned char, 100> test;
// std::copy("testing", test);
// test="testing";
この動作は、「ヌル ターミネータがコピーされるか、コピー先のバッファがいっぱいになるまでコピーする」ことを期待しています。
strlcpy(test.data()... を実行しないようにしようとしていました。これは、バッファー長をパラメーターとして明示的に含めることなく、バッファー オーバーランに対処できる方法を探していたためです。
ありがとう。
編集:
提案からこれまでに見つけた最良の解決策を次に示します。これはリテラルに対してのみ機能します。MSVC には均一な初期化がないため、{ の前に = が必要です。バッファ サイズも必要ですが、バッファ サイズが一致しない場合やオーバーランがある場合はコンパイルに失敗します。
#include <array>
#include <algorithm>
#include <iostream>
int main() {
std::array<char, 100> arr1={"testing"};
std::array<char, 100> arr2;
arr2=arr1;
std::cout << arr2.data();
}
これは一般的に文字列に対して機能しますが、埋め込まれた null はコピーされず、null を含めるには、配列、つまり string mystring("junk\0", 5) で構築する必要があるため注意してください。
#include <string>
#include <array>
#include <algorithm>
#include <iostream>
int main()
{
const std::string str("testing");
std::array<char, 100> arr;
std::copy(str.begin(), str.end(), arr.begin());
// Note that the null terminator does not get copied.
}