使用+ =将字符分配给char数组

时间:2013-01-16 13:55:02

标签: c++ pointers char arrays

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

在所有内容的某处,我编写了一个递归方法来按顺序输出二叉搜索树的值。

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->keyAndValue << '|';,因为我也希望在char数组中包含所有值(我不允许使用字符串或C ++的其他更新功能)以后我可以用不同的方法(例如Main方法)。

Char-Array声明如下:

char *outputString;

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

cout << outputString;

我收到以下错误:

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

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

谢谢和问候,

丹尼斯

2 个答案:

答案 0 :(得分:2)

指针上的

+=指针算术,而不是字符串连接。最终你超越了outputString所指向的数组,并且尝试打印它会导致段错误。

由于您无法使用std::string,因此您需要将strcatnew[]delete[]一起使用,并确保使用{{1}分配原始数组}。

答案 1 :(得分: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;
}

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

您还需要决定在frees1上致电s2的人。

对于它的价值,高效版本看起来像这样:

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;
}

它更有效,因为它只会将输入字符串移动一次。