我有一个缓冲区(为简单起见,假设是一个固定大小的数组)char
我想建造一个std::string
从。所述缓冲区可以是空终止的或者其内容可以运行到并包括最后一个字符。如果缓冲区确实包含一个或多个空值,它们不应该出现在结果中string
。复制应该在第一个 null 处停止or缓冲区的末尾,以先到者为准。
这似乎是一件很常见的事情,但在查看解决方案时,解决方案对我来说并不是显而易见的std::string
API.
-
std::string
有一个构造函数通过以下方式获取范围const char *
和一个长度,但很高兴继续过去空值并将它们复制到字符串中。
- Calling
std::strlen()
在构造之前在缓冲区上string
不是一个选项strlen
要求字符串首先以 null 结尾。
- 我们可以使用上面的构造函数来创建一个
string
包含空值,然后将其大小调整到第一个空值之前,但这会浪费内存,因为string
将会被超额分配。
执行此操作的最佳和/或惯用方法是什么?
与许多有关 C++ 标准库的问题一样,答案是从迭代器的角度来思考问题。
std::string stringFromBuffer(const auto & buffer)
{
return std::string(std::begin(buffer),
std::find(std::begin(buffer), std::end(buffer), '\0'));
}
std::string
有一个带有两个迭代器的构造函数,first
and last
. The string
将通过复制来创建first
直到但不包括last
.
So first
显然应该是我们缓冲区的开始,而last
应该是缓冲区中的第一个空值,或者是缓冲区末尾的空值。方便的是,这正是调用std::find
搜索缓冲区'\0'
将返回。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)