【问题标题】:std::wstring: concatenation with + has no effectstd::wstring:与 + 的连接无效
【发布时间】:2011-10-16 20:45:54
【问题描述】:

解决方案可能很明显,但我看不到。我有这个简单的 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 字符之后。对此有何解释?

【问题讨论】:

  • sPath的声明是什么?
  • 如何确定没有效果?你用sSearchPattern做什么?
  • 请发布真实代码。您的问题几乎肯定在其他地方。
  • 你真的将char*分配给wstring吗?
  • 请不要来回更改您的问题,而是通过添加其他信息来更新它。

标签: c++ string boost stl


【解决方案1】:

这应该有效,并且确实适用于 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\*.*

对我来说。

【讨论】:

  • 对于那些不信任的人 :-) ideone.com/FVBRNideone.com/zmHJw(两个不同版本的 gcc)
  • @Ben Voigt:这是std::wstring + pointer,不是错误。
  • 您的代码是正确的,但我的问题出在其他地方(请参阅我的回答)。
  • @thanatos 宽限期编辑使本的评论看起来很奇怪。答案的原始版本不同。
  • @David Heffernan:我想知道是不是这样......我有点讨厌那个功能这样做。好像有人在改写历史……
【解决方案2】:

我发现存储在字符串末尾的两个 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()。不需要任何笨拙的东西。
  • @DavidHeffernan:我很确定他说的不是只读访问。
  • @BenVoigt,那么他应该使用std::vector&lt;WCHAR&gt;
  • @bdonlan :无论如何,在 C++11 中,没有令人信服的理由使用 std::vector&lt;char&gt; 而不是 std::string 进行读写访问。
【解决方案3】:

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

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

【讨论】:

  • trim_right_if 是一个增强功能,它不是我的问题的原因(见我的回答)。
  • 好吧,你告诉我们 sPath 没有空值,那么我还能合理地得出什么结论?
  • 我们都不知道这一点,您没有提供必要的信息。当然,如果您不知道导致错误的原因,就很难知道哪些信息是必要的,但这就是为什么将错误代码归结为一个完整的、独立的、最好是可编译的重现案例很重要的原因。如果您这样做了,您很可能会在发帖之前自己发现问题。但即使没有,您也可以在这里发布完美的样本,很可能会在 5 分钟内回答您的问题。底线:没有捷径可以将错误归结为重现案例。
  • @helge 你为什么留下一个忘恩负义的评论并发布一个重复我所说的答案,即对空值的不同处理?
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多