2012-04-15 28 views
0

デバッグにお役立てください。それは私にエラー '文字列下付き文字範囲外のエラー'を与えます。C++文字列下付き文字範囲外

プログラムは、挿入ソートアルゴリズムを使用してテキストをソートする必要があります。失敗した

#include<iostream> 
#include<string> 
using namespace std; 

void insertionSort(string &text, int size) { 
    char temp; 
    int i; 
    for(int j=1;j<size;j++) 
    { 
    //text.push_back(temp); 
    temp=text[j]; 
    i=j-1; 
    while(i>=0 && text[i]>temp) 
{ 

text[i+1]=text[i]; 
    i--; 
} 
    text[i+1]=temp; 
    } 
} 

int main() 
{ 
    string text="this a just text need to be sorted"; 

    int size = text.length(); 
    insertionSort(text,size); 
    cout<<text<<endl; 
    return 0; 
} 

デバッグアサーション:ここ

は、コードです!

ライン:1441:

式:文字列の添字Iはtext[i+1]=text[j]text[i+1]=text[i]に変更することになっ

範囲外。

+2

はこの宿題ですか? –

+1

コードのフォーマットが間違っていて、コードのどの部分が問題の原因であるのかはわかりません。 –

+2

エラーがどこで発生したのかを指摘し、これをより適切にフォーマットしようと努力した場合、私たちの生活を楽にすることができます。 – pmr

答えて

2

を交換して評価されていない場合
while(text[i]>temp && i>=0) 

while(i>=0 && text[i]>temp) 

理由:

私が負になると、すなわちi == -1となる場合は、text[i]>temp(-1の位置にある配列要素にアクセスしようとすると、範囲外になる)をチェックするのではなく、最初にi>=0をチェックします。

EDIT:

もなぜ

text[i+1]=text[i]; 

text[i+1]=text[j]; 

置き換えますか? :insertion sortの場合、下の部分(つまり、0からj-1)にtext [j]より大きいエントリがある場合、これらのエントリを先に押して、text [jより大きい要素がなくなった時点で停止する必要があります]。

+0

ありがとう、しかし、それは正しい出力を与えていない、再度ループをチェックする必要があります – mydreamadsl

+1

@mydreamadsl: "文字列の添字が範囲外です"? –

+0

@mydreamadsl上記の私の編集を参照してください。 –

3

あなたはこの命令に変更する必要があります:あなたのwhileループは、I == 0で始まるときj == 1

text[i+1]=text[i]; 
+0

ありがとう! – mydreamadsl

2

、その後、あなたは、ループの次の実行時に、あなたがtext[i]をチェックし、ループ内でiをデクリメントします

while(i >=0 && text[i] > temp) { 
    // ... 
} 
:、これは

は、あなたが最初にiの妥当性をチェックする必要があり、修正するために(ここではi == -1)は無効です

&&オペレータが短絡ルールを持っているので、これは正しいことを行います。falseでの結果(この場合はi>=0)最初のオペランドは、式の残りの部分(text[i] > temp)は

+0

whileループで問題がありますか? – mydreamadsl

+0

@mydreamadsl:はい、上記のコメントをご覧ください。 –

+0

あなたの努力のためにありがとう – mydreamadsl

1

問題についての情報があります。これを解決する簡単な方法は、文字列配列で使用されるインデックス値を知るためにいくつかのprint文を置くことです。

もう1つのコメントは、text.length()を呼び出すと文字列の長さを渡さないでください。それを変更する前に関数内で文字列の長さを取得することができます。

関連する問題