【问题标题】:assign a LPWSTR to an existing wstring将 LPWSTR 分配给现有的 wstring
【发布时间】:2012-09-03 12:28:17
【问题描述】:

我正在寻找一种将 LPWSTR 的内容复制到现有 wstring 的方法。 我找到了很多相反的例子,但我仍在寻找一种方法。

谢谢

【问题讨论】:

    标签: winapi type-conversion wstring


    【解决方案1】:

    您不能保证.c_str() 在修改字符串、句点后会呈现相同的指针(如果您正在尝试这样做)。

    LPWSTR 分配给std::wstring 对象的正确方法是使用operator=(),例如:

    std::wstring existingString = L"text";
    LPCWSTR c_str = L"more text";
    existingString = c_str;
    

    但这非常简单;如果这没有涵盖它,也许你应该详细说明你正在尝试做什么。

    【讨论】:

      【解决方案2】:

      如果这是为了节省分配时间,std::wstring 通常可以做正确的事情,但如果你真的绝对必须这样做......

      wcsncpy(&wstr[0], wsrc, wstr.size()-1);
      wstr[wstr.size()-1] = 0;
      

      我觉得写这个真的很脏。注意:这不会在 wstr 对象中分配空间。此外,我保证如果 wstr 实际上是空的,它会爆炸,所以要小心。它只会使用您已经拥有的任何东西进行存储。如果你想要/需要更多空间,那么 .resize() 适当,但正如我之前所说,std::wstring 的赋值运算符真的会做你想做的事情。

      【讨论】:

      • 完全正确。那将是该答案的“让它”部分。不仅复制到现有的 wstring 中,而且复制到现有 wsting 的实际 memory 中,这可能是矫枉过正,这就是我所写的。使用赋值操作或 .assign() 更安全,我完全同意。
      【解决方案3】:

      这样做是一个 hack 和实现依赖。正确的方法是将 LPCWSTR 分配到 wstring - 然后编译器将确保内容正确复制到现有的 char 缓冲区(如果存在或首先分配它)然后复制。

      【讨论】:

      • 同意这完全是黑客攻击。完全不同意 编译器 将确保复制到现有缓冲区中。 std::wstring 的实现将确保;编译器只是在构建操作码。
      【解决方案4】:

      为什么不

      LPWSTR k = L"my string";
      std::wstring ws(k);
      

      或者如果你真的必须分配给现有的 wstring

       std::wstring existing;
       ....
       existing.assign(k);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 2014-11-05
        • 2013-12-10
        • 2021-10-25
        相关资源
        最近更新 更多