我有一个宽字符变量,我想用字符串大小初始化。 我试过以下但没有奏效。
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会在这种情况下工作吗?
答案 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,但我不确定它们是否相反。