目前我正在编写一个相当广泛的家庭作业,其中包括读取文件,构建二叉搜索树并输出它。
在所有内容的某处,我编写了一个递归方法来按顺序输出二叉搜索树的值。
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 ++完全不熟悉。
谢谢和问候,
丹尼斯
答案 0 :(得分:2)
+=
指针算术,而不是字符串连接。最终你超越了outputString
所指向的数组,并且尝试打印它会导致段错误。
由于您无法使用std::string
,因此您需要将strcat
与new[]
和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;
}
这可以更有效地完成,但这可能与家庭作业无关。你需要检查错误等等。
您还需要决定在free
和s1
上致电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;
}
它更有效,因为它只会将输入字符串移动一次。