TCHAR path[_MAX_PATH+1];
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));
或
TCHAR path[_MAX_PATH];
std::wstring ws(&path[0]);
当将TCHAR
转换为wstring
时,两者都是正确的吗?
我只是要求澄清,我怀疑我是否正确地转换了它。
发布于 2021-09-16 14:21:02
代码在几个方面是有问题的。
首先,std::wstring
是wchar_t
(又名WCHAR
)的字符串,而TCHAR
可能是CHAR
,也可能是WCHAR
,这取决于配置。所以,要么使用WCHAR
和std::wstring
,要么使用TCHAR
和std::basic_string<TCHAR>
(记住std::wstring
只是std::basic_string<WCHAR>
的类型)。
第二,问题在于字符串长度。这个片段:
WCHAR path[_MAX_PATH];
std::wstring ws(&path[0], sizeof(path)/sizeof(path[0]));
将创建一个长度为_MAX_PATH + 1
的字符串,加上一个终止null (可能使用嵌入的null,C++字符串允许这样做)。很可能不是你想要的。
另一个是:
WCHAR path[_MAX_PATH+1];
...
std::wstring ws(&path[0]);
期望path
在构造ws
时保存一个以空结尾的字符串,并将其复制到ws
中。如果path
碰巧没有终止为null,那么UB就会接踵而至(通常,ws
中的垃圾或访问冲突)。
如果您的path
是以空结尾的,或者包含_MAX_PATH
-length字符串,我建议这样使用它:
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
都是相同的)。
发布于 2021-09-16 14:14:47
这取决于path
的内容。如果它是一个可以包含空字符的任意字符数组,那么您应该使用第一个版本来解释大小。但是,如果is包含一个以空结尾的字符串(并且只包含第一个null之后的未使用的值),那么您应该使用第二个值,它将在终止空字符上停止。
https://stackoverflow.com/questions/69209713
复制相似问题