C++ 如何在C+中使用字符串文本初始化动态字符数组+;?
我想做以下工作:C++ 如何在C+中使用字符串文本初始化动态字符数组+;?,c++,arrays,c++11,dynamic-arrays,syntactic-sugar,C++,Arrays,C++11,Dynamic Arrays,Syntactic Sugar,我想做以下工作: std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" }; std::unique_ptr buffer=new char[/*…*/]{/tmp/file-XXXXXX}; 显然,它不起作用,因为我没有指定新数组的大小。在不计算字符串文字中的符号的情况下,实现目标的合适方法是什么 还欢迎使用std::array 更新#1:即使我设置了数组的大小,它也不会工作 更新
std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" };
std::unique_ptr buffer=new char[/*…*/]{/tmp/file-XXXXXX};
显然,它不起作用,因为我没有指定新数组的大小。在不计算字符串文字中的符号的情况下,实现目标的合适方法是什么
还欢迎使用std::array
更新#1:即使我设置了数组的大小,它也不会工作
更新#2:必须以简单的
char*
指针的形式对数组进行非常量访问。由于您请求了动态数组,并且不想计算长度,因此排除了std::array
。您所要求的实际上只是std::string
——它是动态的(如果需要的话),并且从char*
开始初始化,而不计算长度。在内部,它将字符串存储在平面数组中,因此您可以通过c_str()
调用来使用它。我不明白您为什么不使用std::string
;您可以执行str.empty()?NULL:&str[0]
获取非常量指针,因此str.c_str()
的常量不会造成问题
但是,请注意,这不是以null结尾的。这里有一个基于
std::array
的解决方案:
std::array<char, sizeof("/tmp/file-XXXXXX")> arr{ "/tmp/file-XXXXXX" };
std::数组arr{”/tmp/file-XXXXXX};
您可以使用宏缩小样板文件:
#define DECLARE_LITERAL_ARRAY(name, str) std::array<char, sizeof(str)> name{ str }
DECLARE_LITERAL_ARRAY(arr, "/tmp/file-XXXXXX");
#define DECLARE_LITERAL_ARRAY(name,str)std::ARRAY name{str}
声明文字数组(arr,“/tmp/file-XXXXXX”);
sizeof
是在编译时计算的,因此没有运行时扫描文本字符串以查找其长度。结果数组以null结尾,这可能是您无论如何都想要的。一个动态字符数组,因此您指的是一个字符串
——它附带提供了正确的构造函数。如果大小是一个常量(也包括\0
),那么sizeof(“/tmp/lala”)
将适用于大小。我不想要string
,因为数组将作为非常量char*
到mkstemp()
完全正确,但是一个小例子,用一个文本字符串初始化一个string
对象,然后调用c_str
来检索char
数组,这个答案会更好。啊,你没有说明整个问题!因为mkstemp()
修改了它的参数,所以我们需要非常量内存是对的。两个选项:const\u cast(str.c\u str())
。。。这很糟糕,但它是您的字符串,mkstemp()
不会更改长度,因此可能没问题。或者您需要计算字符数并使用std::array
。或者您可以这样做:char*buf=newchar[strlen(模板)];复制(template.begin(),template.end(),buf.begin())代码>@JHUmphrey将常量丢弃不是一个选项。就我所知,这不仅很糟糕,而且完全是非法的(表现出未定义的行为)。@Voo:可能很糟糕,但只有当str.c_str()!=&str[0]
,否则原始存储保证是可变的,因此可以合法地丢弃const
。