为啥我不能从 char* 构造 wstring
Posted
技术标签:
【中文标题】为啥我不能从 char* 构造 wstring【英文标题】:Why I can't construct a wstring from char*为什么我不能从 char* 构造 wstring 【发布时间】:2020-04-16 07:38:15 【问题描述】:根据我构建的这个代码填充一个char*
:
char* pathAppData = nullptr;
size_t sz = 0;
_dupenv_s(&pathAppData, &sz, "APPDATA");
我可以很容易地用这个代码和append
这个string
在未来构造一个string
:
std::string sPathAppData(pathAppData);
sPathAppData.append("\\MyApplication");
但我无法从此代码创建wstring
。为什么使用 wstring
这么复杂?我对所有这些类型都快疯了。
std::wstring wPathAppData(pathAppData); // Impossible
【问题讨论】:
【参考方案1】:您可以直接使用wchar_t
,并使用对应的wchar_t
支持的API将数据直接检索到wchar_t
,然后构造wstring
。 _dupenv_s
函数有一个广泛的对应物 - _wdupenv_s。
您的代码将如下所示:
wchar_t* pathAppData = nullptr;
size_t sz = 0;
_wdupenv_s(&pathAppData, &sz, L"APPDATA");
std::wstring wPathAppData(pathAppData);
wPathAppData.append(L"\\MyApplication")
这可能是一个有趣的阅读:std::wstring VS std::string
【讨论】:
【参考方案2】:您必须使用迭代器来制作副本。这就是你可以做到的。
char* pathAppData = nullptr;
size_t sz = 0;
_dupenv_s(&pathAppData, &sz, "APPDATA");
std::string sPathAppData(pathAppData);
sPathAppData.append("\\MyApplication");
std::wstring wPathAppData(begin(sPathAppData), end(sPathAppData));
wcout << wPathAppData << endl;
【讨论】:
std::wstring wPathAppData(pathAppData, pathAppData + strlen(pathAppData));
也可以工作,并避免创建临时的std::string
。它之所以有效,是因为指针也是迭代器。
感谢您的回答,它有效,但我验证了@Robertas 的回答,因为它更直接。以上是关于为啥我不能从 char* 构造 wstring的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在发布版本中将 char* 字符串从 C++ 返回到 C#?