0

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.
}
4

4 に答える 4

2

これはそれを行う必要があります:

std::array<unsigned char, 100> test = { "testing" };

大きすぎる文字列リテラルを使用するとstd::array、コンパイル時に構築が失敗します。ただし、これは非リテラルでは機能しません。

非リテラルの場合は、ヌル ターミネータを自分で確認する必要があります。のようなこともできますstd::copy(my_non_literal, my_non_literal + length_literal, test.begin());が、すでにそれに遭遇したと思います。

于 2012-09-09T00:34:48.403 に答える
1

このようなものはどうですか?

#include <string>
#include <array>
#include <algorithm>

int main(int argc, char *argv[])
{
  std::string str("testing");
  std::array<char, 100> arr;
  std::copy(str.begin(), std.end(), arr.begin());
}
于 2012-09-09T01:01:10.627 に答える
0

C 文字列と C++ データ構造の間の直接操作は、標準ライブラリが通常扱う問題ではありません。c_str()コンストラクターstd::stringはほとんどそれです。手動でループを作成する必要があります。

于 2012-09-09T00:34:19.457 に答える
0
#include <iostream>
#include <array>
#include <cstring>

int main(){

    std::array<char,100> buffer;
    char * text = "Sample text.";
    std::memcpy (buffer.data(),text,100);
    std::cout << buffer.data() << std::endl;

return 0;
}
于 2012-09-09T00:47:03.893 に答える