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

时间:2016-03-16 17:00:09

标签: c++ string c++11

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

考虑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。 我可以使用一个简单的表格吗?

2 个答案:

答案 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()};