【问题标题】:How to use const WCHAR* variable in wcstok in C++?如何在 C++ 中的 wcstok 中使用 const WCHAR* 变量?
【发布时间】:2019-12-02 11:31:47
【问题描述】:

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

执行此操作时出现以下错误: 错误 C2665 'wcstok':2 个重载都不能转换所有参数类型。

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

谁能帮助我如何在 wcstok 中使用 const WCHAR* 变量? 下面是代码 sn-p:

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);
}

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        “快速”修复(但不好)是用const_cast&lt;WCHAR*&gt;(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!
        

        【讨论】:

          猜你喜欢
          • 2011-08-06
          • 2012-09-25
          • 1970-01-01
          • 2021-09-23
          • 2013-03-23
          • 1970-01-01
          • 1970-01-01
          • 2013-03-30
          • 1970-01-01
          相关资源
          最近更新 更多