2

我有一个带有指针(pBeginpEnd)的字符范围。我认为它是一个字符串,但它没有\0终止。我怎样才能std::cout有效地打印它?

  • 无需创建副本,例如std::string
  • 没有打印每个字符的循环

我们有好的解决方案吗?如果没有,最顺利的解决方法是什么?

4

2 回答 2

6

您可以使用ostream::write,它接受指针和长度参数:

std::cout.write(pBegin, pEnd - pBegin);
于 2013-07-12T11:07:21.270 回答
0

从 C++17 开始,您可以使用std::string_view,它是为共享部分而创建的,std::string无需复制

std::cout << std::string_view(pBegin, pEnd - pBegin);

pEnd必须指向一个传递要打印的最后一个字符,就像 C++ 中的迭代器如何工作,而不是要打印的最后一个字符

在较旧的 C++ 标准boost::string_ref中是一种替代方法。较新的 boost 版本也具有boost::string_viewstd::string_view. 请参阅boost::string_ref 和 boost::string_view 之间的差异

如果您使用 Qt,那么还有QStringViewQStringRef尽管不幸的是,它们用于查看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仍然指向原始数组中的一个元素而不是它的末尾

于 2013-12-21T14:03:56.850 回答