请帮忙调试。它给出了一个错误'字符串下标超出范围错误'。
程序需要使用插入排序算法对文本进行排序。
以下是代码:
#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;
}
debug assertion失败!
行:1441:
表达式:字符串下标超出范围
我应该将text[i+1]=text[j]
更改为text[i+1]=text[i]
;
答案 0 :(得分:3)
您必须更改此说明:
text[i+1]=text[i];
答案 1 :(得分:2)
当j == 1
你的while循环以i == 0开始时,你在循环中递减i
,然后在循环的下一次执行时检查text[i]
,这是无效(i == -1
此处)
要修复,您需要首先检查i
的有效性:
while(i >=0 && text[i] > temp) {
// ...
}
这是正确的,因为&&
运算符有一个短路规则:如果第一个操作数(在这种情况下为i>=0
)导致false
,则表达式的其余部分(text[i] > temp
)未评估
答案 2 :(得分:2)
替换
while(text[i]>temp && i>=0)
带
while(i>=0 && text[i]>temp)
原因:
当我变为负数时,即i == -1
,然后首先检查i>=0
而不是检查text[i]>temp
(它试图访问位置-1处的数组元素并且超出范围)。
修改强>
也替换
text[i+1]=text[j];
带
text[i+1]=text[i];
为什么这样? :在insertion sort中,如果我们在下半部分有大于text [j]的条目(即0到j-1),那么我们需要提前输入这些条目并在我们不再有更大元素时停止比文字[j]。
答案 3 :(得分:1)
你有关于这个问题的信息。解决这个问题的简单方法是,让一些print语句知道字符串数组使用的索引值。
另一个评论是,请不要传递字符串的长度,因为如果你调用text.length();在更改它之前的函数内部可以得到字符串的长度。