2016-08-03 30 views
0

Ich trainiere mich gerade für Sortieralgorithmen, und ich habe ein Problem mit QuickSorting ein String-Array.C++ Schnelles Sortieren eines String-Arrays aus einer TXT-Datei

Mein Code sieht wie folgt aus:

#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; 
    }; 
} 

ich versuchte hundert zufälligen Namen in alphabetischer Reihenfolge zu sortieren. Dieser Code wird ordnungsgemäß kompiliert, aber ich erhalte immer einen Segmentierungsfehler. Wenn ich dieses Programm in CygWin laufen, sieht es wie folgt aus:

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

ich Segmentierungsfehler wissen aus irgendeiner Art von schlechten Zeiger Nutzung ist, aber ich glaube nicht, dass ich finden kann, wo ich es vermasselt. Wo habe ich falsch gemacht? Wie kann ich mit diesem Fehler umgehen?

+2

_ "aber ich glaube nicht, dass ich finden kann, wo ich es vermasselt habe" _ Das Ausführen von Code im Debugger ist äußerst hilfreich, um das herauszufinden. –

+1

Ihr Array "ary" kann nur 100 Strings speichern, aber Sie iterieren bis EOF der Eingabedatei, so Speichern von String Nummer 101 verursacht Schreiben über Array-Grenzen – mooncheese

+0

* Dieser Code kompiliert richtig, aber ich bekomme immer einen Segmentierungsfehler. * - Kompilieren hat eigentlich nichts damit zu tun, ob Ihr Programm Bugs hat oder nicht. Wenn alles, was wir tun müssen, um fehlerfreie Programme zu bekommen, "richtig kompilieren" ist, dann würde kein Programm Fehler haben. – PaulMcKenzie

Antwort

0

Sie setzen den anfänglichen Wert von j in der strQsrt-Funktion auf 99. Dann erhöhen Sie diesen Wert. Segmentierungsfehler tritt auf, wenn j = 101, dh nach der ary Größe. Wenn Sie sehen wollen, für sich selbst modyfy Ihre Funktion

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, ich habe das Problem behoben. – Yeongbae

+0

Wenn dies die Lösung für Ihr Problem war, akzeptieren Sie bitte die Antwort –

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

Ihre

string ary[100]; 

geht von 0 bis 99 für 100 Elemente. Ändern Sie den Code in den folgenden

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

vermeidet Abstürze während des Lesens von Daten.

+0

Es sollte eigentlich 'while (! Input && i <100)' – PaulMcKenzie

+0

@PaulMcKenzie, wenn das Lesen der nächsten einen Absturz verursachen würde, sollte ich das nicht zuerst als überprüfen macht es '! input' eher irrelevant? – Surt