代码之家  ›  专栏  ›  技术社区  ›  Component 10

这些天“结束”有什么用?

  •  14
  • Component 10  · 技术社区  · 15 年前

    几天前我遇到了一个很微妙的错误,代码看起来像这样:

    ostringstream ss;
    int anInt( 7 );
    
    ss << anInt << "HABITS";
    ss << ends;
    string theWholeLot = ss.str();
    

    问题是 ends ostringstream 所以 theWholeLot 实际上看起来像 "7HABITS\0" (即末尾为空)

    现在还没有出现,因为 全能者 当时被用来 const char * 部分使用 string::c_str() 这意味着空值被屏蔽,因为它只是一个分隔符。但是,当这改为在整个过程中使用字符串时,空值突然意味着一些事情和比较,例如:

    if ( theWholeLot == "7HABITS" )
    

    会失败。这让我想:大概是因为 末端 又回到了 ostrstream 当流通常不是以空结束时,必须这样做 str() (然后将其排除在 string 但一 char * )会正常工作。

    然而,现在不可能把 字符* 从A Ostringstream公司 ,使用 末端 不仅是多余的,而且潜在的危险,我正在考虑从我的客户代码中删除它们。

    有人能看到使用的明显原因吗? 末端 在一个 std::string 只有环境?

    2 回复  |  直到 10 年前
        1
  •  7
  •   Peter Alexander    15 年前

    你基本上已经回答了你自己的问题,这和你需要的细节一样多。我当然想不出任何理由来使用 std::ends 什么时候 std::string std::stringstream 为你处理所有这些。

    所以,要明确回答你的问题,不,没有理由使用 STD::结束 在一个 标准::字符串 只有环境。

        2
  •  6
  •   Hans Passant    15 年前

    有些API需要一个带有多个以零结尾的字符串的“字符串数组”,一个以双零结尾的字符串。张瑞蒙最近 blogged about it 最重要的是要证明这一点是多么的频繁。