有没有办法将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必须由数组构造,即字符串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.
}
答案 0 :(得分:2)
这应该这样做:
std::array<unsigned char, 100> test = { "testing" };
如果使用过大的字符串文字,std::array
构造将在编译时失败。但这不适用于非文字。
对于非文字,您需要自己检查空终止符。您可以执行std::copy(my_non_literal, my_non_literal + length_literal, test.begin());
之类的操作,但我认为您已经遇到过这个问题。
答案 1 :(得分: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());
}
答案 2 :(得分:0)
C字符串和C ++数据结构之间的直接操作不是标准库通常处理的问题。 c_str()
和std::string
构造函数非常相似。您必须手动编写循环。
答案 3 :(得分: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;
}