【问题标题】:char* (containing null values) to std::string knowing lengthchar*(包含空值)到 std::string 知道长度
【发布时间】:2013-03-20 13:40:11
【问题描述】:

我正在处理一个必须传输序列化数据的项目。数据使用boost 框架进行序列化,然后存储到字符串流中,最后存储到std::string。为了传输数据,数据(存储为 char*,给定!)和字符串的长度都被存储并且可以在目的地被提取。但是,在尝试提取数据时,我只得到空字符串。到目前为止我尝试过的方法是:

C[i]=*new std::string(content, getDataChunk(), content.getDataLength());

C[i].append(content.getDataChunk(), content.getDataLength());

而 std::string *C=new std::string[K], i

char* p = content.getDataChunk(); 
        int l = content.getDataLength();
        for (int j = 0; j < l; j++) {
            C[i].insert(j, p[j], 1);
        }

(这会在一开始就引发异常 - 我猜是因为 NULL 值!?)

显然,strcpy() 不起作用,因为它使用 char* 作为目的地,该目的地再次以 NULL 结尾...

你们中有人知道如何解决这个问题吗?我希望我不是在问一些每天都会被问到的东西,但是在大量的答案中,很难消除这个机会;)

非常感谢您的任何提示 - TIA!

干杯, 亚历克斯

【问题讨论】:

  • 如果你保存表达式* new something的值,你将会有内存泄漏。
  • C[i]=*new std::string... 是内存泄漏。将其更改为C[i]=std::string...
  • @JoachimPileborg 对,谢谢!我猜它使用 C[i]= std::string(...);,对吗?
  • 谢谢@DrewDormann - 看来我太慢了:)

标签: c++ string null char


【解决方案1】:

为什么不这样做

C[i] = std::string(content.getDataChunk(), content.getDataLength());

它会做正确的事,复制完整的字符串,即使它已经嵌入了'\0' 字符。

【讨论】:

  • 非常感谢!在这种情况下,我猜错误一定在其他地方,我只是看不到在哪里,并认为它一定在这一行......
  • 我猜它不会做正确的事——如果我用 char *p= new char[11]; p="地狱\0 世界";然后: cout
  • @astriffe 使用 clang 3.3(使用 libc++)进行测试,效果很好。您使用的是什么编译器和版本?
  • 奇怪的事情...我正在使用 g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1 .. 你知道偶然的解决方法吗?非常感谢!
  • @astriffe 从您在邮件列表中的帖子来看,也不清楚std::cout 是否有问题;您无法根据终端上打印的内容来判断。至少,您需要通过hd 或其他方式传输您的测试程序,这样您才能真正确定输出的是什么。 [您的示例代码(使用 std::cout)对我来说可以正常工作(输出 6 个字符,包括嵌入式 NUL),g++ 版本为 4.4.7 到 4.8。]
猜你喜欢
  • 2011-11-13
  • 2017-10-21
  • 1970-01-01
  • 2012-08-21
  • 2011-10-26
  • 2017-08-22
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多