Есть ли способ записать литерал cstring (или переменную) непосредственно в существующий массив std ::?
Я хочу сделать что-то вроде этого:
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();
}
В общем случае это работает со строками, но будьте осторожны, потому что встроенный нуль не копируется, и чтобы включить ноль, вы должны построить массив, то есть строку 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.
}
Это должно сделать это:
std::array<unsigned char, 100> test = { "testing" };
Если вы используете слишком большой строковый литерал, std::array
конструкция потерпит неудачу во время компиляции. Это не будет работать для не-литералов, хотя.
Для не-литералов вы должны проверить нулевой терминатор самостоятельно. Вы могли бы сделать что-то вроде std::copy(my_non_literal, my_non_literal + length_literal, test.begin());
, но я думаю, что вы уже сталкивались с этим.
Как насчет этого?
#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());
}
Прямые операции между строками C и структурами данных C ++ не являются проблемой, с которой обычно сталкивается Стандартная библиотека. c_str()
и std::string
конструктор в значительной степени это. Вам придется вручную написать цикл.
#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;
}