我正在编写单元测试,其中字符串必须以二进制零结束。
考虑const char * data_c = "1234";
,此处data_c
包含5个字符,包括零。 std :: string删除零并跟踪向量的大小。 std::string data_cpp = "1234";
我需要创建的字符串最后有一个二进制零。用简单的方法初始化std :: string似乎有问题。 std::string data_cpp{"ABC\0"};
返回一个大小为3的字符串;
以下最小示例显示了传递而不是传递示例以进一步说明我的问题:
#include <iostream>
#include <string>
void testString(std::string name, std::string str)
{
int e = 0;
std::cout << name << "\n";
std::cout << "----------------------" << "\n";
if (4 != str.size())
{
std::cout << "Size was not 4" << "\n";
e += 1;
}
char testvals[] = {'A', 'B', 'C', '\0'};
for (size_t n = 0; n < 4 && n < str.size(); ++n)
{
if (str[n] != testvals[n])
{
std::cout << "Character " << std::to_string(n) << " '" << str[n] << "'" << " did not match" << "\n";
e += 1;
}
}
std::cout << "ERRORS: " << std::to_string(e) << "\n";
std::cout << "----------------------" << std::endl;
}
template<size_t N>
std::string CutomInitString(const char(&str)[N])
{
return std::string{str, str + N - 1};
}
int main()
{
std::string one{"ABC\0"};
testString("ONE", one); //FAILS
const char two_c[] = "ABC\0";
std::string two{two_c};
testString("TWO", two); //FAILS
const char three_c[] = "ABC\0";
std::string three{three_c, three_c + (sizeof(three_c) / sizeof(char)) - 1};
testString("THREE", three); //PASS, also ugly
const char four_c[] = "ABC\0";
std::string four{CutomInitString(four_c)};
testString("FOUR", four); //PASS, also ugly
}
简单的例子是std::string one
。
我可以使用一个简单的表格吗?
答案 0 :(得分:4)
您可以使用PORTD
构造函数来获取缓冲区的大小:
std::string
答案 1 :(得分:1)
编辑:经过一番考虑后重写了答案。
这里的真正问题不在于std::string
,而在于内置数组类型,它实际上并不像容器一样。下面的解决方案与您的解决方案没什么不同,但如果您使用to_array
立即将内置数组类型转换为std::array
,您可能会认为它不那么难看。
auto my_array = std::experimental::to_array("ABC\0");
std::string my_string{my_array.begin(), my_array.end()};