c++ - 将 TCHAR 转换为 wstring
问题描述
TCHAR path[_MAX_PATH+1];
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));
或者
TCHAR path[_MAX_PATH];
std::wstring ws(&path[0]);
虽然将 a 转换TCHAR
为wstring
两者都是正确的?
我只是要求澄清,我怀疑我是否正确转换它。
解决方案
该代码在几个方面存在问题。
首先,std::wstring
是一串wchar_t
(aka WCHAR
) 而TCHAR
可能是CHAR
或WCHAR
,具体取决于配置。所以要么使用WCHAR
and std::wstring
,要么TCHAR
and std::basic_string<TCHAR>
(记住这std::wstring
只是一个 typedef std::basic_string<WCHAR>
)。
其次,问题在于字符串长度。这个片段:
WCHAR path[_MAX_PATH];
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));
将创建一个长度为 的字符串_MAX_PATH + 1
,加上一个终止的空值(并且可能带有嵌入的空值,C++ 字符串允许这样做)。可能不是你想要的。
另一个:
WCHAR path[_MAX_PATH+1];
...
std::wstring ws(&path[0]);
期望在构造path
时保存一个以 null 结尾的字符串ws
,并将其复制到ws
. 如果path
碰巧不是以空值终止的,则会出现 UB(通常是垃圾输入ws
或访问冲突)。
如果您path
的是以null 结尾或包含-length_MAX_PATH
字符串,我建议像这样使用它:
WCHAR path[_MAX_PATH+1];
... // fill up to _MAX_PATH characters
path[_MAX_PATH] = L'0'; // ensure it is null-terminated
std::wstring ws(path); // construct from a null-terminated string
或者,如果您知道实际长度,只需传递它:
WCHAR path[_MAX_PATH];
size_t length = fill_that_path(path);
std::wstring ws(path, length); // length shouldn’t include the null terminator, if any
请参阅文档(除了不同的 char 类型外,它是相同的)string
。wstring
推荐阅读
- c# - c# devexpress 双击在两个网格之间传输数据
- python - Jupyter kernel points to the wrong Python
- python - 在 Flask 中下载多个文件
- z3 - 量词 + 未解释函数的 Z3 使用建议
- c++ - 架构 arm64 的未定义符号:m1 mac
- javascript - 如何在来自 html 的跨源本地存储之间共享数据以响应 iFrame?
- python - 通过特定值重新采样和插值 Dataframe
- java - 即使当时服务器没有启动,如何确保执行一次运行的石英作业?
- laravel-8 - 作曲家需要 designmynight/laravel-mongodb-passport 未安装在 laravel8 中
- c# - 失去焦点时自定义文本框值消失