0

独自の文字列クラスの構築に取り組んでいますが、部分文字列に問題があります

// Substring operator
// reutns a substring from a given point
String String::Substring(int startPosition, int length) const{
    if(length==0)
        length = GetLength()+1; //Takes care of null terminator, im not worried about if length is imputed yet
    char* result = new char[length-startPosition]; // Assume it's not negative for the sake of just getting it to work, It would only be negative if it's user error
    for(int i=startPosition; i<length; i++)
        result[i] = Text[i]; //Since it will always  go from a given point to the end, the null terminator will transfer in the for loop.

    return result;
}

テキストは文字列クラスのデータメンバーです。未処理の例外、アクセス違反の読み取り場所が表示されます。

私がデバッグしている間、それはこれらのプロセスを経ていました

// Init-constructor for initializing this string with a C-string
String::String(const char* text){
    *this = text;
}

// Assigns C-string to this String
String& String::operator = (const char* text){
    // Delete the existing string first
    delete[] Text;

    // +1 accounts for null terminator
    int trueLength = GetLength(text)+1;

    // Allocate new memory
    Text = new char[trueLength];

    // Copy all characters from source into Text
    for ( int i = 0; i < trueLength; i++)
        Text[i] = text[i];

    return *this;
}

あなたの助けに感謝して、私は私が間違っていることを理解することができません。

4

2 に答える 2

1

char*コンストラクターを使用して String オブジェクトを作成するとどうなるかを考えてみましょう。

String::String(const char* text){
  *this = text;
}

どのメンバーもまだ初期化されておらず、次のように呼び出しoperator=ます。

String& String::operator = (const char* text){
  // Delete the existing string first
  delete[] Text;

member を削除Textしますが、まだ初期化していません。初期化されたポインターを削除すると、未定義の動作が発生します。この場合、動作は例外です。

Textを呼び出す前にコンストラクターで null に初期化するかoperator=、代入演算子ではなくコンストラクターですべての作業を行います。

于 2012-11-29T21:26:29.473 に答える
1

割り当てるときlength-startPositionは、負の数を使用する可能性が非常に高くなります。

長さだけで新しいことを行います:

char* result = new char[length];

編集:

からコピーを開始しi=0、最後にコピーされた文字の後のバイトを null に設定します。

for(int i=0; i<length; i++)
    result[i] = Text[i+startPosition];

result[i] = '\0';
于 2012-11-29T21:23:49.700 に答える