我有如下代码:
BOOST_FIXTURE_TEST_CASE(test, TestSuite1)
{
unsigned int length = 5;
char* content1=new char[length];
content1="abcde";
string content2("abcde");
BOOST_REQUIRE( length == content2.length() );
for(unsigned int i=0;i<5;++i)
{
BOOST_CHECK( content1[i] == content2[i] );
}
if(content1 != nullptr)
{
delete[] content1;
content1 = nullptr;
}
}
问题是如何在boost单元测试中比较char*和string? 我用过循环,但我不知道这是否是一个好方法。 还有更好的解决办法吗?非常感谢。
使用
BOOST_CHECK_EQUAL
以便在发生故障时获得不错的输出。使用您的代码(修复丢失的 strcpy 后):
BOOST_FIXTURE_TEST_CASE(test, TestSuite1)
{
// Set up for testing. I assume that in production, `content1` will
// come from the code under test.
char* content1=new char[6];
strcpy(content1, "abcde");
const std::string reference("abcde");
BOOST_CHECK_EQUAL(reference, content1);
delete[] content1;
}
如果
content1
与字符串引用匹配,则通过。如果失败:
Running 1 test cases...
test_demo.cpp:13: error: in "TestSuite1/test": check reference == content1 has failed [abcde != abcd2e]
*** 1 failure is detected in the test module "Test_demo"
使用
strcmp
进行比较:
std::string s = "anything";
char* c = "anything";
BOOST_CHECK(strcmp(s.c_str(),c)==0);
您的代码设计是有缺陷的,因为您创建了一个固定长度的数组,并且即使您打算将其与字符串进行比较,也不以空终止字符终止它。
您可以使用 c.str strin 成员函数返回 C 字符样式下的字符串,然后使用 strcmp 函数(win APi)。 但在打算将 C 数组与转换后的字符串变量进行比较之前,您确实需要确保 C 数组以 null 结尾。
为什么不使用 std::string::compare 方法:
BOOST_CHECK(content2.compare(0, length, content1)==0)
它与 boost 无关,您可以像在任何其他情况下一样比较
std::string
和 char *
:
content2.compare(content1) == 0
content2 == content1
如果您正在编写 C++ 并使用
std::string
那么您应该坚持使用 C++ 而不是使用像 strcmp
这样的 C 函数。
您的代码中还存在其他问题。比如这个作品:
char* content1=new char[length];
content1="abcde";
并不完全按照你的想法去做。首先分配一个
char
数组,然后立即将 content1
指针设置为指向其他内容。这不会将 abcde
复制到您分配的空间中,而是将实际指针更改为内存中的另一个地址。您之前为 content1
分配的空间将永远丢失。
然后你会得到这个:
if(content1 != nullptr)
{
delete[] content1;
content1 = nullptr;
}
再次强调,这并不像你想象的那样。它不会释放您在程序开始时使用
new
分配的空间,因为 content1
不再指向该空间。它指向存储 abcde
字符串的内存,但您尚未分配该空间,因此不应尝试释放它。这样做会导致未定义的行为,并且您的程序可能会崩溃或做其他奇怪的事情。
您应该学会注意编译器在编译过程中告诉您的内容。这一行:
content1="abcde";
肯定会生成警告,请仔细阅读并尝试理解它告诉您的内容。
其实只是使用
BOOST_TEST
BOOST_TEST 无需额外步骤即可比较它们。
BOOST_AUTO_TEST_CASE( test_strings )
{
const char* a = "test1";
const char* b = "test2";
const char* c = "test1";
BOOST_TEST(a == b);
BOOST_TEST(a == c);
}
注意:用户@Logman 在下面的评论中指出了重要问题。