gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:27:31 25 4
gpt4 key购买 nike

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

.. 在 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() 使字符串变小时,它只会截断不需要的字符串末尾并添加一个空终止符,它不会覆盖您写入的内容。

注意初始的 resize() 将对字符串进行零填充,这在您的情况下并不是绝对必要的,因为您将覆盖您关心的部分,然后丢弃其余部分。如果字符串非常长并且分析显示零填充是一个问题,那么您可以这样做:

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

关于c++11 - 有没有办法在不修改缓冲区内容的情况下设置 std::string 的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com