2016-08-03 19 views
0

現在ソートアルゴリズムを学習しており、文字列配列のクイックソートに問題があります。C++ txtファイルから読み込んだ文字列配列のクイックソート

私のコードは次のようになります。

#include<iostream> 
#include<fstream> 
#include<string> 

using namespace std; 

void strQsrt(string * ary, int l, int r); 

int main() 
{ 
    int i=0; 
    string temp; 
    string ary[100]; 

    ifstream input("inputtext.txt"); 
    while(!input.eof()) 
    { 
    input >> ary[i]; 
    cout << i+1 << " : " << ary[i] << endl; 
    i++; 
    }; 
    cout << endl; 

    strQsrt(ary, 0, 99); 

    return 0; 
} 

void strQsrt(string * ary, int l, int r) 
{ 
    int i=l, j=r; 
    string temp; 
    string mid=ary[ (l+r)/2 ]; 

    while(i <= j) 
    { 
    while(ary[i] < mid) 
    { 
     i++; 
    }; 
    while(ary[j] > mid) 
    { 
     j++; 
    }; 
    if(i <= j) 
    { 
     temp = ary[i]; 
     ary[i] = ary[j]; 
     ary[j] = temp; 
     i++; 
     j++; 
    }; 
    }; 

    if(l < j) 
    { 
    strQsrt(ary, l, j); 
    }; 
    if(i < r) 
    { 
    strQsrt(ary, i, r); 
    }; 

    for(int c = 0; c < 100; c++) 
    { 
    cout << c+1 << " : " << ary[c] << endl; 
    }; 
} 

私はアルファベット順に百個のランダムなファイル名をソートしようとしていました。このコードは正しくコンパイルされますが、セグメント化エラーが発生します。私Cygwin環境でこのプログラムを実行すると、それは次のようになります。

$ ./binarysearch.exe 
1 : Brittny 
2 : Margarett 
3 : Mariella 
4 : Amanda 
5 : Isabella 
6 : Meghan 
7 : Junior 
8 : Pamela 
9 : Arnette 
10 : Toi 
11 : Serina 
12 : Kim 
13 : Peggy 
14 : Ellena 
15 : Paul 
16 : Alica 
17 : Keli 
18 : Dorine 
19 : Conception 
20 : Ora 
21 : Nakia 
22 : Elmer 
23 : Teddy 
24 : Jacinda 
25 : Paris 
26 : Beula 
27 : Lavette 
28 : Marla 
29 : Brandi 
30 : Neva 
31 : Niesha 
32 : Dustin 
33 : Lane 
34 : Season 
35 : Norene 
36 : Karisa 
37 : Johnathon 
38 : Dan 
39 : Lavenia 
40 : Zonia 
41 : Chau 
42 : Stanton 
43 : Patty 
44 : Shyla 
45 : Elfriede 
46 : Leida 
47 : Fawn 
48 : Karrie 
49 : Joanne 
50 : Rivka 
51 : Roslyn 
52 : Cris 
53 : Enola 
54 : Rafaela 
55 : Bula 
56 : Teressa 
57 : Jackqueline 
58 : Antoinette 
59 : Lizeth 
60 : Torie 
61 : Farrah 
62 : Stefani 
63 : Tamisha 
64 : Masako 
65 : Margarita 
66 : Sandi 
67 : Beau 
68 : Candelaria 
69 : Lia 
70 : Tamra 
71 : Anne 
72 : Lona 
73 : Odell 
74 : Alethia 
75 : Tama 
76 : Lina 
77 : Carli 
78 : Viviana 
79 : Dorothy 
80 : Rima 
81 : Robert 
82 : Karolyn 
83 : Silvana 
84 : Florine 
85 : Kandice 
86 : Ernesto 
87 : Nola 
88 : Jasper 
89 : Dalia 
90 : Lashunda 
91 : Ralph 
92 : Delois 
93 : Mathew 
94 : Doretta 
95 : Aron 
96 : Barrie 
97 : Hazel 
98 : Lino 
99 : Danna 
100 : Nancy 

Segmentation fault (core dumped) 

私は、セグメンテーションフォールトが悪いポインタの使用法のいくつかの種類から知っているが、私はそれを台無しにどこで見つけることができるとは思いません。どこが間違っていたのですか?このエラーをどうすれば処理できますか?

+2

_ "しかし、私はどこにいらっしゃいましたかわかりません" _デバッガでコードを実行すると、見つけ出すのが非常に便利です。 –

+1

配列 "ary"は100個の文字列しか格納できませんが、入力ファイルのEOFまで反復するので、文字列番号101を格納すると配列境界に書き込まれます – mooncheese

+0

*このコードは正しくコンパイルされますが、あなたのプログラムにバグがあるかどうかはまったく関係ありません。バグのないプログラムを得るためにやらなければならないことがすべて「適切にコンパイル」されていれば、プログラムにはバグはありません。 – PaulMcKenzie

答えて

0

strQsrt関数のjの初期値を99に設定しています。その値を増やしています。セグメンテーションフォールトは、j = 101、つまりaryサイズを過ぎたときにポップアウトされます。あなた自身のため確認したい場合は

void strQsrt(string * ary, int l, int r) 
{ 
    int i=l, j=r; 
    string temp; 
    string mid=ary[ (l+r)/2 ]; 


    while(i <= j) 
    { 
    while(ary[i] < mid) 
    { 
     i++; 
    } 
    while(ary[j] > mid) 
    { 
     cout<<"j="<<j<<endl; 
     j++; 
    } 
    if(i <= j) 
    { 
     temp = ary[i]; 
     ary[i] = ary[j]; 
     ary[j] = temp; 
     i++; 
     j++; 
    } 
    } 


    if(l < j) 
    { 
    strQsrt(ary, l, j); 
    }; 
    if(i < r) 
    { 
    strQsrt(ary, i, r); 
    }; 

    for(int c = 0; c < 100; c++) 
    { 

    cout << c+1 << " : " << ary[c] << endl; 
    }; 
} 
+0

Thx、問題を修正しました。 – Yeongbae

+0

これはあなたの問題に対する解決策でした。答えは –

0
while(!input.eof()) 
    { 
    input >> ary[i]; 
    cout << i+1 << " : " << ary[i] << endl; 
    i++; <------- when this gets to 100, what happens on next iteration? 
    }; 

にあなたの関数をmodyfyあなた

string ary[100]; 

は100個の要素に0から99まで行きます。 以下

while(i < 100 && !input.eof()) 
    { 
    input >> ary[i]; 
    cout << i+1 << " : " << ary[i] << endl; 
    i++; 
    }; 

にコードを変更すると、データの読み出し時にクラッシュを回避します。

+0

です。実際は 'while(!input && i <100)' – PaulMcKenzie

+0

@PaulMcKenzieです。次のものを読むとクラッシュする場合は、それは '!input'を無関係にしますか? – Surt

関連する問題