有没有办法在不修改缓冲区内容的情况下设置 std::string 的长度?

is there a way to set the length of a std::string without modifying the buffer content?

根据这些问题的回答中所做的陈述

.. 在 C++11 中,应该可以调用 C API 函数,该函数采用 char 指针来存储输出,如下所示:

str::string str;
str.reserve(SOME_MAX_VALUE);
some_C_API_func(&str[0]);

但是现在是否有一种合法的方法可以将字符串的大小设置为缓冲区内(以空字符结尾的)内容的长度?像这样:

str.set_size(strlen(&str[0]));

这是对 std::string 的一种非常不美观的滥用,反正我听到你说了,但是我不能在堆栈上创建一个临时的 char 缓冲区,所以我必须在堆中创建一个缓冲区,之后销毁它(我想避免)。

有什么好的方法吗?也许不保留,但 调整大小 并在之后调用 erase() 会做到这一点,但感觉不太整洁..

您应该使用 resize() 而不是 reserve(),然后再次 resize() 来设置最终长度。

否则,当你resize()从零到strlen()返回的结果时,数组将被填充为零字符,覆盖你写入的内容。允许字符串这样做,因为它(正确地)假定从当前大小到当前保留容量的所有内容都是未初始化的数据,不包含任何内容。

为了让字符串知道这些字符实际上是有效的并且应该保留它们的内容,您需要最初使用resize(),而不是reserve()。然后,当您再次 resize() 使字符串更小时,它只会截断字符串不需要的结尾并添加一个空终止符,它不会覆盖您写入的内容。

N.B。最初的 resize() 将零填充字符串,这在您的情况下并不是绝对必要的,因为您将覆盖您关心的部分,然后无论如何丢弃其余部分。如果字符串很长并且分析显示零填充是一个问题,那么您可以改为这样做:

std::unique_ptr<char[]> str(new char[SOME_MAX_VALUE]);
some_C_API_func(str.get());