【问题标题】:Compare two std::string like strcmp would do比较两个 std::string 像 strcmp 会做
【发布时间】:2015-03-24 14:39:54
【问题描述】:

看看下面这段代码

#include <string>
#include <assert.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char cstr[8] = {'t','e','s','t','\0','\0','\0','\0'};
    std::string str1;
    str1.assign(std::begin(cstr), std::end(cstr));
    assert(str1.length() == 8);
    std::string str2("test");
    assert(str2.length() == 4);

    // Unexpected
    assert(str1 != str2);
    assert(str1.compare(str2) != 0);

    // Expected
    assert(strcmp(str1.c_str(), str2.c_str()) == 0);

    return 0;
}

在 VS 2013 中,所有断言都通过了,乍一看可能会令人惊讶。但是,我相信如果仔细阅读每个相关方法的规范,就会清楚这确实是预期的行为。但这是预期的吗?我认为它不是。有没有一种简单的方法来比较两个 std::string 对象,比如 strcmp() 会做吗?

【问题讨论】:

  • 你的意思是:除了strcmp(str1.c_str(), str2.c_str())?如果你想要 C 风格字符串的行为,这种组合对我来说似乎一点也不合理。

标签: c++ string comparison string-comparison


【解决方案1】:

我可以想到两种方法来进行比较:

  • 保持字符串规范化并使用operator==(不要添加不需要的尾随空终止符)。
  • 如果出于某种原因您确实需要额外的尾随空终止符,请使用strcmp

【讨论】:

  • 一个人可能不知道两个 std::string 实例的来源,所以选项二可能是要走的路
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多