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;

これは、私が試した方法の 1 つにすぎません。また、キーワードを使用して、const定期的に配列を作成してみましたchar outputString[]。お見せしたバージョンでは、後でプログラムの別のメソッドで次のコードを呼び出すと、エラーが発生します。

cout << outputString;

次のエラーが表示されます。

BST.exe の 0x008c2c2a で未処理の例外: 0xC00000005: アクセス違反の読み取り場所 0x5000000000。

+=アクセス違反をトリガーすることなく、動的なchar配列を作成し、値を何度も使用して出力する方法についての手がかりはありますか? かなり基本的な質問をして申し訳ありませんが、C++ はまったく初めてです。

よろしくお願いいたします。

デニス

4

2 に答える 2

2

+=on pointer は、文字列の連結ではなく、ポインター演算を行います。最終的outputStringに、指していた配列を超えてしまい、それを印刷しようとするとセグメンテーション違反が発生します。

を使用できないため、 andと一緒std::stringに使用し、元の配列を で割り当てたことを確認する必要があります。strcatnew[]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あり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;
}

入力文字列を 1 回だけ処理するため、より効率的です。

于 2013-01-16T13:59:59.967 に答える