连接2个char *会产生奇怪的结果

时间:2016-11-03 09:37:13

标签: c++ ios objective-c

关闭 - 我是C ++的新手。

所以我处理的情况是我有两个char*需要连接并传递给另一个方法。这应该很简单,但我无法理解......

第一个字符和getMetaData()方法声明以供参考

virtual const char *getMetaData() const = 0
char* metaChar = const_cast<char*>(result->getMetaData());

第二个字符和getUniqueTargetId()方法声明以供参考

virtual const char *getUniqueTargetId() const = 0
char* idChar = const_cast<char*>(result->getUniqueTargetId());

现在我需要将它们组合起来传递给方法setUserData()。以下是它的声明:

virtual bool setUserData(void *userData) = 0

现在,如果我将每个char单独传递到setUserData()方法,那么它可以正常工作。如果我尝试连接它们然后传递结果,它会产生nil或一些看起来像拉丁语的随机字符。

我尝试过以下内容(以及其他一些内容和变体):

  1. 将每个转换为NSString,将它们连接起来,转换回char
  2. 尝试连接两个char数组
  3. 投射到各种不同的东西来回
  4. 将其关闭并重新打开
  5. 检查metaChar的类型和上面选项1的结果,它们对应 - 显然完全相同
  6. 再一次 - 我是这些部分的新成员......可能有一些显而易见的东西我已经失踪了但现在已经过了好几个小时了,这似乎是一个不应该占用这么多时间的问题。

2 个答案:

答案 0 :(得分:2)

这里有很多讨厌的const_cast和转化为void*,但我认为你已经给出了这些方法,因此无法做很多事情。

假设setUserData获取内部传递的字符串的副本,那么对于两个char*&#34;字符串&#34; foobar,您可以使用

setUserData(const_cast<void*>(reinterpret_cast<const void*>((std::string(foo) + std::string(bar)).c_str())));

我依靠std::string +的重载来执行连接。 c_str()返回const char*,并且在语句的生命周期内有效。我希望希望 setUserData获取&#34;字符串&#34;的深层副本:检查功能文档。如果我不正确,那么这种方法是不起作用的。请注意,我们通过void*投射到const_cast我并不是特别喜欢,但明确表达此类事情是件好事。

如果您拥有&#34;所有功能,然后抛弃所有这些char*废话,并从一开始就使用std::string

答案 1 :(得分:0)

所以我最终找到了我的解决方案 - 谢谢大家的帮助!

我基本上走了很长一段路,是的,这看起来似乎是多余的,但对于一个完整的初学者(就像一周的经验 - 我被强迫在这里)它有效... < / p>

char* metaChar = const_cast<char*>(result->getMetaData());
char* idChar = const_cast<char*>(result->getUniqueTargetId());

char *buffer = new char[(int)strlen(metaChar)+(int)strlen(idChar)+5]();
strncat(buffer, idChar, strlen(idChar));
strncat(buffer, metaChar, strlen(metaChar));
strncat(buffer, "\0", 2);

newTrackable->setUserData(buffer);

+5只是为char或任何可能需要更多空间的东西提供缓冲区(哈......看看我在那里做了什么?)。比抱歉安全。