2012-04-15 206 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:

表達:串標超出範圍

我應該改變text[i+1]=text[j]text[i+1]=text[i];

+2

是這功課嗎? – 2012-04-15 15:51:29

+1

您的代碼格式不正確,而且您沒有指出代碼的哪一部分導致了問題。 – 2012-04-15 15:51:55

+2

如果您指出錯誤發生的位置並使得格式更好,您可以使我們的生活更輕鬆。 – pmr 2012-04-15 15:52:02

回答

2

替換

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

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

原因:

當i變爲負的,即i == -1,然後首先檢查而不是做爲text[i]>temp檢查(它試圖在位置訪問數組元素-1和給出的範圍)i>=0

編輯:

同時更換

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

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

爲什麼會這樣? :在insertion sort如果我們具有比文本[j]的在下部更大的條目(即,0至j-1),那麼我們需要向前推進這些條目並且在點停止時,我們不再有除了文本更大元素[J ]。

+0

謝謝,但它沒有給出正確的輸出,必須再次檢查循環 – mydreamadsl 2012-04-15 16:09:57

+1

@mydreamadsl:所以「字符串下標超出範圍」不見了? – 2012-04-15 16:10:54

+0

@mydreamadsl見我上面的編輯。 – 2012-04-15 16:19:25

3

你必須改變這個指令:

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

非常感謝你! – mydreamadsl 2012-04-15 16:19:04

2

j == 1 while循環開始與我== 0,那麼你在循環遞減i,然後在您檢查text[i]循環的下一次執行,這是無效的(i == -1這裏)

要解決,您需要檢查的i第一有效性:

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

這確實是正確的,因爲&&操作者具有短路的規則:如果在false第一操作數(i>=0在這種情況下)的結果,該表達式的其餘部分(text[i] > temp)不評估

+0

問題在while循環? – mydreamadsl 2012-04-15 16:02:20

+0

@mydreamadsl:是的,請看我上面的評論。 – 2012-04-15 16:06:28

+0

感謝你的努力 – mydreamadsl 2012-04-15 16:16:10

1

你大概是problem.The簡單的方法來解決這個問題是,把一些打印語句知道與字符串數組中使用的指標值的信息。

另一個意見是,請不要傳遞字符串的長度,因爲如果你調用text.length();在改變它之前的函數裏面可以得到字符串的長度。