首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将TCHAR转换为wstring

将TCHAR转换为wstring
EN

Stack Overflow用户
提问于 2021-09-16 13:53:33
回答 2查看 623关注 0票数 0
代码语言:javascript
运行
复制
TCHAR path[_MAX_PATH+1]; 
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));

代码语言:javascript
运行
复制
TCHAR path[_MAX_PATH]; 
std::wstring ws(&path[0]);

当将TCHAR转换为wstring时,两者都是正确的吗?

我只是要求澄清,我怀疑我是否正确地转换了它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-16 14:21:02

代码在几个方面是有问题的。

首先,std::wstringwchar_t (又名WCHAR)的字符串,而TCHAR可能是CHAR,也可能是WCHAR,这取决于配置。所以,要么使用WCHARstd::wstring,要么使用TCHARstd::basic_string<TCHAR> (记住std::wstring只是std::basic_string<WCHAR>的类型)。

第二,问题在于字符串长度。这个片段:

代码语言:javascript
运行
复制
WCHAR path[_MAX_PATH];
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));

将创建一个长度为_MAX_PATH + 1的字符串,加上一个终止null (可能使用嵌入的null,C++字符串允许这样做)。很可能不是你想要的。

另一个是:

代码语言:javascript
运行
复制
WCHAR path[_MAX_PATH+1]; 
...
std::wstring ws(&path[0]);

期望path在构造ws时保存一个以空结尾的字符串,并将其复制到ws中。如果path碰巧没有终止为null,那么UB就会接踵而至(通常,ws中的垃圾或访问冲突)。

如果您的path是以空结尾的,或者包含_MAX_PATH-length字符串,我建议这样使用它:

代码语言:javascript
运行
复制
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

或者,如果你知道实际长度,就把它传递出去:

代码语言:javascript
运行
复制
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类型之外,stringwstring都是相同的)。

票数 2
EN

Stack Overflow用户

发布于 2021-09-16 14:14:47

这取决于path的内容。如果它是一个可以包含空字符的任意字符数组,那么您应该使用第一个版本来解释大小。但是,如果is包含一个以空结尾的字符串(并且只包含第一个null之后的未使用的值),那么您应该使用第二个值,它将在终止空字符上停止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69209713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档