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

Concatenating 2 char* produces weird result

本文关键字:结果 char 两个 连接      更新时间:2023-10-16

我是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的结果,它们对应-显然完全相同

再次-我是新来的这些部分…可能我遗漏了一些明显的东西,但是现在已经好几个小时了,这似乎是一个不应该占用这么多时间的问题。

这里有很多讨厌的const_cast和到void*的转换,但我假设你已经给出了这些方法,所以不能做太多。

假设setUserData接受内部传递的字符串的副本,那么对于char*的两个"字符串"foobar,您可以使用

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

这里我依靠std::string+的重载来执行连接。c_str()返回一个const char*,并且在语句的生命周期内有效。我希望 setUserData采用"字符串"的深度拷贝:检查函数文档。如果我说的不对,那么这种方法是行不通的。请注意,我们是通过一个const_cast来强制转换到void*,我不是特别喜欢,但是明确说明这种事情是很好的。

如果你"拥有"所有的功能,那么抛弃所有这些char*的废话,从一开始就使用std::string

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

我基本上绕了很长一段路,是的,这看起来相当多余,但对于一个完整的初学者(就像一个星期的经验-我在这里是被迫的)它是有效的…

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, "", 2);
newTrackable->setUserData(buffer);

+5只是为了提供一个缓冲区(ha…看到我在那里做了什么?)的char或任何可能需要更多空间的东西。