Существует ли стандартная функция для копирования cstring (возможно, литерала) в std :: array?

Есть ли способ записать литерал 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.
}

0

Решение

Это должно сделать это:

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

Если вы используете слишком большой строковый литерал, std::array конструкция потерпит неудачу во время компиляции. Это не будет работать для не-литералов, хотя.

Для не-литералов вы должны проверить нулевой терминатор самостоятельно. Вы могли бы сделать что-то вроде std::copy(my_non_literal, my_non_literal + length_literal, test.begin());, но я думаю, что вы уже сталкивались с этим.

2

Другие решения

Как насчет этого?

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

Прямые операции между строками C и структурами данных C ++ не являются проблемой, с которой обычно сталкивается Стандартная библиотека. c_str() и std::string конструктор в значительной степени это. Вам придется вручную написать цикл.

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;
}
0
По вопросам рекламы [email protected]