首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char*到char[]

char*到char[]
EN

Stack Overflow用户
提问于 2011-04-05 20:34:15
回答 7查看 756关注 0票数 6

我有char*,它的宽度是固定的(已知),但不是以null结尾的。

我想把它传递给LOG4CPLUS_ERROR("Bad string " << char_pointer);,但是因为它不是以null结尾的,所以它将全部打印出来。

有什么建议可以在不执行复制的情况下获得"(char[length])*char_pointer"的轻量级方法吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-04-05 21:32:17

真正的iostream%s

当你在写一个真正的iostream时,你可以只使用ostream.write(),它接受一个char*和一个大小来表示要写入的字节数--不需要空终止。(实际上,字符串中的任何空字符都将写入ostream,并且不会用于确定大小。)

日志库

在一些日志库中,您写入的流不是真正的iostream。在Log4CPP中就是这种情况。

但是,在Log4CPlus中,您要写入的对象是一个std::basic_ostringstream<tchar> (有关定义,请参阅loggingmacros.hstreams.h,因为从文档中看不出这一点)。只有一个问题:在宏LOG4CPLUS_ERROR中,第一个<<已经内置到宏中,所以他不能调用LOG4CPLUS_ERROR(.write(char_pointer,length))或类似的东西。不幸的是,如果不解构LOG4CPLUS_ERROR error宏并深入了解Log4CPlus的内部结构,我找不到解决这个问题的简单方法

解决方案

我不知道为什么在这一点上要尽量避免复制字符串,因为您可以看到在日志记录库中正在进行大量的复制。任何试图避免额外字符串复制的尝试都可能是不必要的优化。

我假设这是一个代码整洁的问题,也许是一个确保复制发生在LOG4CPLUS_ERROR宏内的问题,而不是在它之外的问题。在这种情况下,只需使用:

代码语言:javascript
复制
LOG4CPLUS_ERROR("Bad string " << std::string(char_pointer, length));
票数 2
EN

Stack Overflow用户

发布于 2011-04-05 20:37:22

不,您必须进行深度复制并将其空终止。该代码需要一个以null结尾的字符串,它表示以null结束符结尾的连续字符块。

票数 7
EN

Stack Overflow用户

发布于 2011-04-05 20:38:32

如果您的目标是打印这样的字符串,您可以:

  1. 存储最后一个字节。
  2. 将其替换为\0。
  3. 打印字符串。
  4. 打印存储的字节。
  5. 将存储的字节放回字符串的最后位置。

将所有这些都封装在一个函数中。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5551874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档