Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 有没有一种方法可以在不修改缓冲区内容的情况下设置std::string的长度?_C++11_Char_Stdstring - Fatal编程技术网

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

根据回答这些问题时所作的陈述

。。在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.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的方法不允许使用
操作符==
比较字符串。