std :: wstring:与+连接无效

时间:2011-10-16 20:45:55

标签: 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"\\*.*";

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

注意:sPathwstring

我想要实现的目标:

sSearchPattern -> C:\SomePath\*.*

更多信息:

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

3 个答案:

答案 0 :(得分: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;
}

打印

C:\SomePath\*.*

对我来说。

答案 1 :(得分:3)

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

  

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

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

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

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

答案 2 :(得分:0)

真实代码中的某些内容是在字符串末尾添加额外的空字符。你的错误在于代码。

字符串连接非常有效。 std::wstring不会以空值终止,因此连接只会添加到缓冲区的末尾。这使std::wstring与C字符串略有不同,因为它可以保存空字符。我怀疑这种细微差别是所有混乱的根源。