C++11 有没有一种方法可以在不修改缓冲区内容的情况下设置std::string的长度?
根据回答这些问题时所作的陈述C++11 有没有一种方法可以在不修改缓冲区内容的情况下设置std::string的长度?,c++11,char,stdstring,C++11,Char,Stdstring,根据回答这些问题时所作的陈述 。。在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])); 但是现在是否有合法的方法将字符串的大小设置为缓冲区内(以null结尾)内容的长度?大概是这样的: str::string str; str.r
str::string str;
str.reserve(SOME_MAX_VALUE);
some_C_API_func(&str[0]);
str.set_size(strlen(&str[0]));
但是现在是否有合法的方法将字符串的大小设置为缓冲区内(以null结尾)内容的长度?大概是这样的:
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());
std::unique_ptr str(新字符[某些最大值]);
一些函数(str.get());
您是否尝试过调整大小
?是的,但是调整大小()
似乎会修改内容。至少当我reserve()
缓冲区和resize()
它之后,字符串是空的。它似乎与调整大小(一些最大值)一起工作。如果有人让我相信这是最复杂的方法,我很高兴:)@frans,为什么不使用std::array设置字符串大小?unique的方法不允许使用操作符==
比较字符串。