Как инициализировать динамический массив символов с помощью строкового литерала в C ++?

Я хочу сделать следующее:

std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" };

Очевидно, что это не работает, потому что я не указал размер нового массива. Как правильно достичь своей цели, не считая символы в строковом литерале?

Использование std::array также приветствуется.

Обновление № 1: даже если я укажу размер массива, он тоже не будет работать.

Обновление № 2: жизненно важно иметь неконстантная доступ к массиву как простой char* указатель.

2

Решение

Вот решение, основанное на std::array:

std::array<char, sizeof("/tmp/file-XXXXXX")> arr{ "/tmp/file-XXXXXX" };

Вы можете уменьшить шаблон, используя макрос:

#define DECLARE_LITERAL_ARRAY(name, str) std::array<char, sizeof(str)> name{ str }
DECLARE_LITERAL_ARRAY(arr, "/tmp/file-XXXXXX");

sizeof вычисляется во время компиляции, поэтому во время выполнения не выполняется сканирование литеральной строки для определения ее длины. Результирующий массив завершается нулем, что вам, вероятно, все равно нужно.

4

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

Поскольку вы запросили динамический массив и не хотите считать длину, это исключает std::array<char,N>, То, что вы просите, на самом деле просто std::string — он динамический (при необходимости) и прекрасно инициализируется из char* без учета длины. Внутри он хранит строку в плоском массиве, так что вы можете использовать ее как таковой через c_str() вызов.

2

Я не понимаю, почему вы не используете std::string; ты можешь сделать str.empty() ? NULL : &str[0] чтобы получить неконстантный указатель, поэтому константа str.c_str() не собирается создавать проблемы.

Тем не менее, обратите внимание, что это не заканчивается нулем.

1
По вопросам рекламы [email protected]