代码之家  ›  专栏  ›  技术社区  ›  frans

有没有方法在不修改缓冲区内容的情况下设置std::字符串的长度?

  •  15
  • frans  · 技术社区  · 10 年前

    根据这些问题答案中的陈述

    ..在C++11中,应该可以调用一个C API函数,该函数采用一个字符指针来存储如下输出:

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

    但是现在有没有合法的方法 设置大小 字符串的长度与缓冲区内(以空结尾)内容的长度之比?类似于:

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

    这是对 std::string 无论如何,我听到你说,但我不能创建一个临时 char 堆栈上的缓冲区,所以我必须在堆中创建缓冲区,然后销毁它(我想避免)。

    有什么好办法吗?也许没有保留,但 调整大小 和呼叫 erase() 事后会这样做,但感觉不太整洁。。

    2 回复  |  直到 8 年前
        1
  •  12
  •   Jonathan Wakely    10 年前

    你应该使用 resize() reserve() 然后 调整大小() 再次设置最终长度。

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

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

    N、 B.首字母 调整大小() 将零填充字符串,这在您的情况下不是绝对必要的,因为您将覆盖您关心的部分,然后无论如何都放弃其余部分。如果字符串很长,并且分析显示零填充是一个问题,那么您可以改为执行以下操作:

    std::unique_ptr<char[]> str(new char[SOME_MAX_VALUE]);
    some_C_API_func(str.get());
    
        2
  •  0
  •   glades    2 年前

    在C++20之前,这是C++的一个已知限制。

    从C++23中,您可以使用 resize_and_overwrite() :