std :: wstring:与+连接无效

Hel*_*ein 2 c++ string boost stl

解决方案可能很明显,但我没有看到.我有这个简单的C++代码:

// Build the search pattern
// sPath is passed in as a parameter into this function
trim_right_if(sPath, is_any_of(L"\\"));
wstring sSearchPattern = sPath + L"\\*.*";
Run Code Online (Sandbox Code Playgroud)

我的问题是+运算符没有效果(在调试器中检查).该字符串sSearchPattern初始化为sPathonly 值.

注意:sPath是一个wstring.

我想要实现的例子:

sSearchPattern -> C:\SomePath\*.*

更多信息:

当我在调试器中查看sPath时,在最后一个字符后面看到两个NULL字符.当我查看sSearchPattern时,会附加"\*.*",但是在两个NULL字符之后.对此有何解释?

sbi*_*sbi 8

这应该有效,并且确实适用于VS2010,SP1:

#include <iostream>
#include <string>

int main()
{
    const std::wstring sPath = L"C:\\SomePath";
    const std::wstring sSearchPattern = sPath + L"\\*.*";

    std::wcout << sSearchPattern << L'\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印

C:\SomePath\*.*

为了我.

  • 对于那些不信任的人:-) http://ideone.com/FVBRN和http://ideone.com/zmHJw(两个不同版本的gcc) (2认同)

Hel*_*ein 5

我发现存储在字符串末尾的两个 NULL 字符是问题所在。显然 std::wstring 不像旧的 C 字符串那样关心 NULL。如果它认为一个字符串有 10 个字符长,它并不关心这 10 个字符中是否有一些是 NULL 字符。如果随后附加到该字符串,则附加字符将附加在第 10 个字符之后。如果字符串的最后一个字符恰好是 NULL,您将得到:

C:\\SomePath\0\0\\*.*

这样的字符串实际上不能在任何地方使用。

我如何获得原始字符串末尾的 NULL 字符?我在其他一些用 NULL 填充字符串的函数中使用了 wstring.resize()。我这样做是为了将 &string[0] 传递给需要 LPWSTR 的 Windows API 函数。

现在我知道这不起作用,我改用真正的 LPWSTR。这有点笨拙,但它有效。来自 MFC,我想我可以像 CString 一样使用 std::wstring 及其 GetBuffer 和 Release 方法。

  • 当您需要 LPCWSTR 时使用 c_str()。不需要任何笨拙的东西。 (4认同)
  • @bdonlan:无论如何,在 C++11 中,没有令人信服的理由使用 `std::vector&lt;char&gt;` 而不是 `std::string` 进行读写访问。 (2认同)