如何在 C++ 中的 wcstok 中使用常量 WCHAR* 变量?



我有一个具有不同路径的字符串(std::wstring变量(。我正在将该字符串转换为 WCHAR,以便我可以标记字符串,并且还可以使用 ExpandEnvironmentString 解析路径(以 % 符号开头(。

这样做时,我收到以下错误: 错误 C2665 'wcstok':2 个重载都无法转换所有参数类型。

这是因为我们在 wcstok 中传递了 const WCHAR* 变量。

谁能帮我如何在 wcstok 中使用常量 WCHAR* 变量? 下面是代码片段:

std::wstring wstrFileLocation;
std::vector<std::wstring> pathsVector;
const WCHAR * wpszProcToSearch = wstrFileLocation.c_str();
TCHAR szOut[MAX_PATH];
const wchar_t delim[] = L".xml";
wchar_t* ptr;
wchar_t *token = wcstok(wpszProcToSearch, delim, &ptr);
while (token != NULL)
{
ExpandEnvironmentStrings(token, szOut, ARRAYSIZE(szOut));
pathsVector.push_back(szOut);
}

使用WCHAR* wpszProcToSearch = &wstrFileLocation[0];
获取
指向非常量WCHARs 的指针。

从 C++17 开始,您还可以使用data()它还返回指向非 constWCHARs 的指针。

函数wcstok的第一个参数应该是指向wchar_t元素的可修改(非常量(数组的指针。

您正在传递wstrFileLocation.c_str(),这是一个指向不可修改(const(wchar_t元素数组的指针。

您应该分配一个wchar_t元素的临时数组,将wstrFileLocation.c_str()的内容复制到其中并将其传递给函数。

一个"快速"修复(但不好(是用const_cast<WCHAR*>(wpszProcToSearch)(或类似的东西(抛弃指针的恒定性- 但这是在自找麻烦。

更好的方法是将wstrFileLocation.c_str()给出的缓冲区复制到非常量数组中(简单,使用wcsdup(,如下所示(完成后不要忘记free缓冲区(:

std::vector<std::wstring> pathsVector;
WCHAR* wpszProcToSearch = wcsdup(wstrFileLocation.c_str());
//  const WCHAR* wpszProcToSearch = wstrFileLocation.c_str();
TCHAR szOut[MAX_PATH];
const wchar_t delim[] = L".xml";
wchar_t* ptr;
wchar_t* token = wcstok(wpszProcToSearch, delim, &ptr);
while (token != NULL)
{
ExpandEnvironmentStrings(token, szOut, ARRAYSIZE(szOut));
pathsVector.push_back(szOut);
}
free(wpszProcToSearch); // Don't forget to free the buffer!

最新更新