在指针之间打印文本

Posted

技术标签:

【中文标题】在指针之间打印文本【英文标题】:Print text between pointers 【发布时间】:2013-07-12 11:05:18 【问题描述】:

我有一个带有指针的字符范围(pBeginpEnd)。我认为它是一个字符串,但它不是\0 终止的。如何有效地将其打印到std::cout

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

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

【问题讨论】:

std::string( pBegin, pEnd ) 的副本有什么问题?这是这样做的自然方式(与实际输出所花费的时间相比,副本不会引人注目)。 这个答案对我很有用。也许我对原始问题的问题进行了太多转换,应该询问std::ostream,可以是std::stringstream。差异可能计算在内。 【参考方案1】:

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

std::cout.write(pBegin, pEnd - pBegin);

【讨论】:

【参考方案2】:

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

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

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

What is string_view? In C++11 what is the most performant way to return a reference/pointer to a position in a std::string?

在较旧的 C++ 标准中,boost::string_ref 是一种替代方案。较新的 boost 版本还具有与 std::string_view 相同语义的 boost::string_view。见Differences between boost::string_ref and boost::string_view

如果您使用 Qt,那么还有 QStringViewQStringRef,尽管不幸的是它们用于查看 QString,它以 UTF-16 而不是 UTF-8 或面向字节的编码存储数据

但是,如果您需要通过一些需要 null-terminated 字符串而不需要任何外部库的函数来处理字符串,那么有一个简单的解决方案

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 仍然指向原始数组内部的元素,而不是超出数组末尾的元素

【讨论】:

以上是关于在指针之间打印文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中打印指针内容

为啥打印指针与打印取消引用的指针打印相同的东西?

内核中通过函数指针打印出具体的函数

sql中的case表达式以在用户提示的情况下打印所需的文本

:字符串文本各种打印转义序列手动输入raw_input()

在指针c ++的向量中打印指针的值[重复]