我有一个带有指针(pBegin
和pEnd
)的字符范围。我认为它是一个字符串,但它没有\0
终止。我怎样才能std::cout
有效地打印它?
- 无需创建副本,例如
std::string
- 没有打印每个字符的循环
我们有好的解决方案吗?如果没有,最顺利的解决方法是什么?
您可以使用ostream::write,它接受指针和长度参数:
std::cout.write(pBegin, pEnd - pBegin);
从 C++17 开始,您可以使用std::string_view
,它是为共享部分而创建的,std::string
无需复制
std::cout << std::string_view(pBegin, pEnd - pBegin);
pEnd
必须指向一个传递要打印的最后一个字符,就像 C++ 中的迭代器如何工作,而不是要打印的最后一个字符
在较旧的 C++ 标准boost::string_ref
中是一种替代方法。较新的 boost 版本也具有boost::string_view
与std::string_view
. 请参阅boost::string_ref 和 boost::string_view 之间的差异
如果您使用 Qt,那么还有QStringView
,QStringRef
尽管不幸的是,它们用于查看QString
以 UTF-16 而不是 UTF-8 或面向字节的编码存储数据
但是,如果您需要通过一些需要空终止字符串而没有任何外部库的函数来处理字符串,那么有一个简单的解决方案
char tmpEnd = *pEnd; // backup the after-end character
*pEnd = '\0';
std::cout << pBegin; // use it as normal C-style string, like dosomething(pBegin);
*pEnd = tmpEnd; // restore the char
在这种情况下,请确保它pEnd
仍然指向原始数组中的一个元素,而不是它的末尾