如何在C ++中使用字符串文字初始化动态字符数组?

时间:2014-12-30 14:55:22

标签: c++ arrays c++11 dynamic-arrays syntactic-sugar

我想做以下事情:

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

显然,它不起作用,因为我没有指定新数组的大小。在不计算字符串文字中的符号的情况下,实现目标的适当方法是什么?

也欢迎使用std::array

更新#1:即使我把数组的大小,它也无法正常工作。

更新#2:非const 访问数组作为一个简单的char*指针至关重要。

3 个答案:

答案 0 :(得分:4)

以下是基于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在编译时进行评估,因此没有文本字符串的运行时扫描来查找其长度。结果数组以null结尾,无论如何你可能想要它。

答案 1 :(得分:2)

由于您请求了动态数组并且不想计算长度,因此排除了std::array<char,N>。你要求的只是std::string - 它是动态的(如果需要的话),并且从char*初始化得很好而不计算长度。在内部,它将字符串存储在一个平面数组中,因此您可以通过c_str()调用来使用它。

答案 2 :(得分:1)

我不知道你为什么不使用std::string;您可以str.empty() ? NULL : &str[0]来获取非常量指针,因此str.c_str()的常量不会造成问题。

但请注意,这不是以空值终止的。