像 strcmp 那样比较两个 std::string
Compare two std::string like strcmp would do
看看下面这段代码
#include <string>
#include <assert.h>
int _tmain(int argc, _TCHAR* argv[])
{
char cstr[8] = {'t','e','s','t','[=11=]','[=11=]','[=11=]','[=11=]'};
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() 会做?
我可以想到两种方法来进行比较:
- 保持字符串规范化并使用
operator==
(不要添加不需要的尾随空终止符)。
- 如果出于某种原因您确实需要额外的尾随空终止符,请使用
strcmp
。
看看下面这段代码
#include <string>
#include <assert.h>
int _tmain(int argc, _TCHAR* argv[])
{
char cstr[8] = {'t','e','s','t','[=11=]','[=11=]','[=11=]','[=11=]'};
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() 会做?
我可以想到两种方法来进行比较:
- 保持字符串规范化并使用
operator==
(不要添加不需要的尾随空终止符)。 - 如果出于某种原因您确实需要额外的尾随空终止符,请使用
strcmp
。