我有一个具有不同路径的字符串(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];
获取
指向非常量WCHAR
s 的指针。
从 C++17 开始,您还可以使用data()
它还返回指向非 constWCHAR
s 的指针。
函数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!