初始化宽字符数组

时间:2012-05-11 06:31:38

标签: c++

我有一个宽字符变量,我想用字符串大小初始化。 我试过以下但没有奏效。

std::string s = "aaaaaaaaaaaaaaaaaaaaa"; //this could be any length 
const int Strl = s.length();
wchar_t wStr[Strl ]; // This throws error message as constant expression expected.

我有什么选择才能实现这一目标? malloc会在这种情况下工作吗?

3 个答案:

答案 0 :(得分:3)

由于这是C ++,请使用new代替malloc

它不起作用,因为C ++不支持VLA。 (可变长度数组)

数组的大小必须是编译时常量。

 wchar_t* wStr = new wchar_t[Strl];

 //free the memory
 delete[] wStr;

答案 1 :(得分:3)

首先,你不能只是将一个字符串复制到一个宽字符数组 - 一切都会在你身上狂暴。

std::string使用char构建,std::wstring使用wchar_t构建。将string复制到wchar_t[]是行不通的 - 你会得到胡言乱语。阅读UTF8和UTF16以获取更多信息。

那就是说,正如Luchian所说,VLAs can't be done in C++和他的堆分配就可以了。

但是,我必须问为什么你这样做?如果您使用std::string,则不应该(几乎)需要使用字符数组。我假设您正在尝试将字符串传递给一个将字符数组/指针作为参数的函数 - 您是否知道将返回指向内容的指针的字符串的.c_str()函数?

答案 2 :(得分:1)

std::wstring ws;
ws.resize(s.length());

这将为您提供一个用于此目的的wchar_t容器,并且在概念上是一个可变长度的容器。并尝试尽可能远离C ++中的C风格数组,标准容器适合各种情况,包括与C api库的接口。如果你需要将字符串从char转换为wchar_t,c ++ 11引入了一些字符串转换函数来从wchar_t转换为char,但我不确定它们是否相反。