1

デバッグを手伝ってください。エラー「文字列添え字が範囲外エラー」になります。

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

コードは次のとおりです。

#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:

式:文字列の添え字が範囲外です

私はに変更text[i+1]=text[j] することになっていましたtext[i+1]=text[i];

4

4 に答える 4

3

この命令を変更する必要があります。

text[i+1]=text[i];
于 2012-04-15T15:53:32.927 に答える
3

交換

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

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

理由:

i が負になると、つまり、 check forを実行する代わりにi == -1、最初に forをチェックします (位置 -1 の配列要素にアクセスしようとし、範囲外になります)。i>=0text[i]>temp

編集:

交換も

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

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

なんでそうなの ?:挿入ソートでは、下位部分 (つまり 0 から j-1) に text[j] より大きいエントリがある場合、これらのエントリを先に進めて、text[ より大きい要素がなくなった時点で停止する必要があります。 j].

于 2012-04-15T16:05:35.667 に答える
2

j == 1while ループが i==0 で始まる場合、ループ内でデクリメントiし、ループの次の実行時に をチェックしますがtext[i]、これは無効です (i == -1ここ)

i修正するには、最初の有効性を確認する必要があります。

while(i >=0 && text[i] > temp) {
  // ...
}

&&演算子には短絡規則があるため、これは正しいことを行います。最初のオペランド (i>=0この場合) の結果が の場合false、残りの式 ( text[i] > temp) は評価されません。

于 2012-04-15T15:56:04.440 に答える
1

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

別のコメントとして、文字列の長さを渡さないでください。変更する前に関数内で文字列の長さを取得できます。

于 2012-04-15T16:19:54.167 に答える