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 变为负数时,即i == -1,首先检查i>=0而不是检查text[i]>temp(它试图访问位置 -1 处的数组元素并给出超出范围)。

编辑:

也更换

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

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

为什么这样 ?:在插入排序中,如果我们在下部有大于 text[j] 的条目(即 0 到 j-1),那么我们需要将这些条目向前推,并在我们不再有大于 text[ 的元素时停止j]。

于 2012-04-15T16:05:35.667 回答
2

j == 1您的 while 循环以 i==0 开始时,您在i循环中递减,然后在下一次执行循环时检查text[i],这是无效的(i == -1此处)

要修复,您需要检查ifirst 的有效性:

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

这样做是正确的,因为&&运算符有一个短路规则:如果第一个操作数(i>=0在这种情况下)导致false,则表达式的其余部分 ( text[i] > temp) 不会被计算

于 2012-04-15T15:56:04.440 回答
1

你有关于问题的信息。解决这个问题的简单方法是,放置一些打印语句来知道字符串数组使用的索引值。

另一个评论是,请不要传递字符串的长度,因为如果您调用 text.length(); 在更改之前在函数内部可以获取字符串的长度。

于 2012-04-15T16:19:54.167 回答