2012-05-11 134 views
0

我有一个宽的字符变量,我想用字符串的大小进行初始化。 我试过,但没有奏效。初始化宽字符数组

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

由于这是C++,请使用new而不是malloc

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

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

wchar_t* wStr = new wchar_t[Strl]; 

//free the memory 
delete[] wStr; 
+0

并使用一个智能指针来为你执行'delete []'。 –

3

首先,你不能只是一个字符串复制到一个宽字符数组 - 一切都会去疯抢你。

A std::string使用char构建,std::wstring使用wchar_t构建。将string复制到wchar_t[]不会起作用 - 您会收到乱码。请阅读UTF8和UTF16了解更多信息。

也就是说,由于Luchian说,VLAs can't be done in C++和他的堆分配将做的伎俩。

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

+0

好吧,一个std :: string包含一个'char'数组。 'wchar_t'不是'char',而是一个宽字符。他可能需要将字符串转换为UNICODE表示。 –

+0

@LuchianGrigore我其实已经更新了我的答案以反映这一点。如果这是他要做的事情,那么手动复制字节将保证失败。 –

+0

嗯,我希望他没有用memcpy :) –

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

这将给你一个wchar_t容器,它将用于这个目的,并且在概念上是一个可变长度容器。尽可能地避免使用C++中的C风格数组,在任何情况下,标准容器都适合账单,包括与C api库的接口。如果你需要将你的字符串从char转换为wchar_t,C++ 11引入了一些字符串转换函数将wchar_t转换为char,但是我不确定它们是否以相反的方式工作。