2016-08-03 3 views
0

현재 정렬 알고리즘을 배우고 있으며 문자열 배열을 quicksorting하는 데 문제가 있습니다.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; 
    }; 
} 

I는 알파벳 순서로 백 임의의 이름을 정렬하는 데 노력했다. 이 코드는 제대로 컴파일되지만 세그먼트 오류가 계속 발생합니다.

$ ./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) 

내가 분할 오류가 잘못된 포인터 사용의 어떤 종류에서 알고,하지만 난 그것을 엉망 어디서 찾을 수 있다고 생각하지 않습니다 : 내가 Cygwin에서이 프로그램을 실행하면 다음과 같습니다. 나는 어디에서 잘못 했는가? 이 오류를 어떻게 해결할 수 있습니까?

+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? 
    }; 

당신의

string ary[100]; 

에 기능을 modyfy에 대한보고 싶다면 (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