fra*_*ans 6 char stdstring c++11
根据这些问题的答案中的陈述
..在C++ 11中应该可以调用一个C API函数,它接受一个char指针来存储输出,如下所示:
str::string str;
str.reserve(SOME_MAX_VALUE);
some_C_API_func(&str[0]);
Run Code Online (Sandbox Code Playgroud)
但是现在有一种合法的方法可以将字符串的大小设置为缓冲区内(空终止的)内容的长度吗?像这样的东西:
str.set_size(strlen(&str[0]));
Run Code Online (Sandbox Code Playgroud)
这是一个非常不美观的滥用,std::string无论如何我听到你说,但我不能char在堆栈上创建一个临时缓冲区,所以我必须在堆中创建一个缓冲区并在之后销毁它(我想避免).
有一个很好的方法来做到这一点?也许不是保留,但事后调整和调用erase()会做到但是它感觉不好整洁..
您应该使用resize()不是reserve(),然后resize()再设定最终长度.
否则当你resize()从零到strlen()数组返回的结果将填充零个字符时,覆盖你写入的内容.允许该字符串执行此操作,因为它(正确地)假定从当前大小到当前保留容量的所有内容都是未包含任何内容的未初始化数据.
为了让字符串知道字符实际上是有效的并且应该保留它们的内容,你需要先使用resize(),而不是reserve().然后当你resize()再次使字符串变小时,它只截断字符串的不需要的结尾并添加一个空终止符,它不会覆盖你写入它的内容.
NB初始化resize()将填充字符串,这在您的情况下并不是绝对必要的,因为您将覆盖您关心的部分,然后丢弃其余部分.如果字符串很长并且分析显示零填充是一个问题,那么你可以这样做:
std::unique_ptr<char[]> str(new char[SOME_MAX_VALUE]);
some_C_API_func(str.get());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4275 次 |
| 最近记录: |