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
复制相似问题