【问题标题】:Assigning chars to a char array with +=使用 += 将字符分配给 char 数组
【发布时间】:2013-01-16 13:55:01
【问题描述】:

目前,我正在编写一个相当广泛的家庭作业,其中包括读取文件、构建二叉搜索树并将其输出。

在其中的某个地方,我编写了一个递归方法来按顺序输出二叉搜索树的值。

void output(node* n)
{
if(n->leftChild != NULL)
    output(n->leftChild);
cout << n->keyAndValue << " || ";
outputString += n->keyAndValue << '|';
if(n->rightChild != NULL)
    output(n->rightChild);
}

这没问题,但是您会注意到outputString += n-&gt;keyAndValue &lt;&lt; '|'; 这一行,因为我还希望将所有值都包含在一个 char 数组中(我不允许使用字符串或其他更当前的 C++ 功能),我以后可以在不同的方法中使用(例如 Main 方法)。

Char-Array 声明如下:

char *outputString;

这只是我尝试过的方法之一。我还尝试使用const 关键字并定期构建一个数组char outputString[]。使用我向您展示的版本,当稍后在程序中以不同的方法调用以下代码时遇到错误:

cout &lt;&lt; outputString;

我收到以下错误:

BST.exe 中 0x008c2c2a 处未处理的异常:0xC00000005:访问冲突读取位置 0x5000000000。

关于如何构建动态 char 数组、使用 += 多次为其赋值并在不触发访问冲突的情况下输出它的任何线索?很抱歉问了一个相当基本的问题,但我对 C++ 完全陌生。

感谢和问候,

丹尼斯

【问题讨论】:

  • 任何阻止你使用std::string的人都应该被带到外面并开枪。一周的每一天。
  • 您是否最终向 SO 社区证明您无法拿起一本 C++ 书籍并阅读它?
  • @DavidHeffernan 这是家庭作业。
  • 你不能像这样附加到字符指针,更不用说outputString += n-&gt;keyAndValue &lt;&lt; '|' 即使在std::string 上也不会像写的那样工作。如果你被限制在char* 这将是不必要的困难,但是考虑用malloc 创建一个“非常大”的缓冲区,然后用strcat 附加到它。
  • 因为这是家庭作业,我只会向您指出malloc 的大致方向,然后就这样吧。当然,如果允许,您应该使用std::string 而不是char*

标签: c++ pointers char arrays


【解决方案1】:

+= on pointers 进行指针运算,而不是字符串连接。最终,您超出了outputString 指向的数组,尝试打印它会导致段错误。

由于您不能使用std::string,因此您需要将strcatnew[]delete[] 一起使用,并确保使用new[] 分配原始数组。

【讨论】:

  • 感谢您的快速回复,不幸的是,正如我所说,在我应该在讲座中获得的知识范围内,我不允许使用字符串来做作业。
  • @DennisRöttger 对不起,阅读不好。您只需重新分配数组并在需要连接时复制到其中。
  • 还值得一提的是,纯 C 字符串在通过coutFILE 输出之前需要以\0 终止。
【解决方案2】:

我猜既然你不能用std::string,你也不能用new[]

你可以用这样的函数连接字符串:

char *concat(const char *s1, const char *s2)
{
    size_t len = strlen(s1) + strlen(s2);
    char *result = (char*)malloc(len+1);
    strcpy(result, s1);
    strcat(result, s2);
    return result;
}

这可以更有效地完成,但这可能与家庭作业无关。并且你需要检查错误等等。

您还需要决定谁将在s1s2 上致电free

不管怎样,高效的版本如下所示:

char *concat(const char *s1, const char *s2)
{
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);
    char *result = (char*)malloc(len1+len2+1);
    memcpy(result, s1, len1);
    memcpy(result+len1, s2, len2);
    result[len1+len2] = '\0';
    return result;
}

效率更高,因为它只遍历输入字符串一次。

【讨论】:

  • @AlexeyFrunze 因为我很懒。现在改变了。
  • 当然也可以使用更多const。另外,我很震惊,因为这是 C++ 我猜你 must cast the return value of malloc()
  • @unwind 是的,我进入了 C 模式!
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2012-10-16
  • 2012-05-03
相关资源
最近更新 更多