0

有没有办法将 cstring 文字(或变量)直接写入现有的 std::array 中?

即,我想做这样的事情:

std::array<unsigned char, 100> test;
// std::copy("testing", test);
// test="testing";

我希望行为是“复制直到复制空终止符或目标缓冲区已满”。

我试图避免执行 strlcpy(test.data()... 因为我正在寻找一种可以应对缓冲区溢出的方法,而不必明确将缓冲区长度作为参数包含在内。

谢谢。


编辑:

这是迄今为止我从建议中找到的最佳解决方案。这仅适用于文字。MSVC 没有统一初始化,所以它需要在 then { 之前添加 =。它还需要缓冲区大小,但如果缓冲区大小不匹配或存在溢出,则编译失败:

#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();
}

这通常适用于字符串,但要小心,因为嵌入的空值不会被复制,并且要包含空值,您必须通过数组构造,即字符串 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 回答