0

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

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

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++ 完全陌生。

谢谢并恭祝安康,

丹尼斯

4

2 回答 2

2

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

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

于 2013-01-16T13:56:38.417 回答
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;
}

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

您还需要决定谁将free调用s1s2

对于它的价值,高效的版本如下所示:

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

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

于 2013-01-16T13:59:59.967 回答