当数据以二进制零结尾时,如何初始化 std::string
How to initialise a std::string when data ends in a binary zero
我正在编写一个单元测试,其中字符串必须以二进制零结尾。
考虑const char * data_c = "1234";
,这里data_c
包含 5 个字符,包括零。 std::string 删除该零并像向量一样跟踪大小。 std::string data_cpp = "1234";
我需要创建的字符串末尾有一个二进制零。用简单的方法初始化 std::string 似乎有问题。 std::string data_cpp{"ABC "};
返回大小为 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', ' '};
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 "};
testString("ONE", one); //FAILS
const char two_c[] = "ABC ";
std::string two{two_c};
testString("TWO", two); //FAILS
const char three_c[] = "ABC ";
std::string three{three_c, three_c + (sizeof(three_c) / sizeof(char)) - 1};
testString("THREE", three); //PASS, also ugly
const char four_c[] = "ABC ";
std::string four{CutomInitString(four_c)};
testString("FOUR", four); //PASS, also ugly
}
简单的一个例子是 std::string one
.有没有可以使用的简单表格?
您可以使用采用缓冲区大小的 std::string
构造函数:
basic_string( const CharT* s,
size_type count,
const Allocator& alloc = Allocator() );
编辑:经过一番考虑后重写了答案。
这里真正的问题不在于std::string
,而在于内置数组类型,它实际上不像容器那样工作。下面的解决方案与您的解决方案没有太大区别,但如果您使用 to_array
将内置数组类型立即转换为 std::array
,您可能会认为它不那么丑陋。
auto my_array = std::experimental::to_array("ABC ");
std::string my_string{my_array.begin(), my_array.end()};
相关文章:
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 使用通用值初始化 std::map,不重复
- 初始化 std::vector 替换为单大括号而不是双大括号
- 在构造函数中使用可变参数初始化 std::tuple
- 使用大括号初始化 std::vector 使用初始值设定项列表
- 为什么初始化 std::vector 时不能使用模板整数?
- 如何在构造函数参数中初始化"std::set"?
- 初始化 std::数组 of Eigen::Map
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 在 C++20 之前和之后初始化 std::atomic
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 如何初始化 std::向量的映射?
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 使用范围库初始化 std::vector
- 如何在类的初始值设定项列表中初始化 std::array,而不对数组的大小进行硬编码
- 我是否需要在构造函数中显式初始化 std::unique_ptr?
- 如何使用派生类类型数据初始化 std::shared_ptr?
- 为什么我必须在初始化 std::array<SomeStruct, size> 时指定每个项目的类型C++
- 根据指针条件初始化std::vector
- 正在使用unique_ptr初始化std::vector