解决方案可能很明显,但我没有看到。我有这个简单的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
的值。
注意:sPath
是wstring
。
我想要实现的目标:
sSearchPattern -> C:\SomePath\*.*
更多信息:
当我在调试器中查看sPath时,在最后一个字符后面看到两个NULL字符。当我查看sSearchPattern时,会附加“\ *。*”,但是在两个NULL字符之后。对此有何解释?
答案 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字符串略有不同,因为它可以保存空字符。我怀疑这种细微差别是所有混乱的根源。