当数据以二进制零结尾时,如何初始化 std::string

How to initialise a std::string when data ends in a binary zero

本文关键字:初始化 std string 数据 二进制 结尾      更新时间:2023-10-16

我正在编写一个单元测试,其中字符串必须以二进制零结尾。

考虑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()};