如何从可能包含或不包含 null 的缓冲区构造“std::string”?

Par*_*tes 5 c++ stdstring null-terminated

我有一个char已知大小的缓冲区(为简单起见,假设是一个固定大小的数组),我想从中构造一个std::string. 此缓冲区中的字符串可能以 null 结尾,或者可能会一直运行到并包括最后一个char. 我希望创建一个std::string包含直到第一个空字节缓冲区末尾的内容(以先到者为准)的内容。

这似乎是一件很常见的事情,但在查看 API 时,解决方案对我来说并不是显而易见的std::string

  • std::string有一个构造函数接受范围const char *和长度,但是这个构造函数很高兴地继续过去的空字节并将它们复制到字符串中。
  • 在构造之前调用std::strlen()缓冲区string不是一个选项,因为strlen要求缓冲区以空终止,但情况可能并非如此。
  • 我们可以使用上面的构造函数来创建一个std::string包含空值的对象,然后将其大小调整到第一个空值之前,但这会浪费内存,因为string会被过度分配。

执行此操作的最佳和/或惯用方法是什么?

Par*_*tes 14

与许多有关 C++ 标准库的问题一样,答案是从迭代器的角度来思考问题。

std::string stringFromBuffer(const auto & buffer)
{
    return std::string(std::begin(buffer),
                       std::find(std::begin(buffer), std::end(buffer), '\0'));
}
Run Code Online (Sandbox Code Playgroud)

std::string有一个带有两个迭代器的构造函数,first并且last. 将通过复制从直到但不包括 来string创建。firstlast

因此first显然应该是缓冲区的开始,而last应该是缓冲区中的第一个空值或超过缓冲区末尾的空值。std::find方便的是,这正是搜索缓冲区的调用'\0'将返回的结果。