C ++快速排序从txt文件中读取的字符串数组

Posted

技术标签:

【中文标题】C ++快速排序从txt文件中读取的字符串数组【英文标题】:C++ Quicksorting a string array read from a txt file 【发布时间】:2016-08-03 09:12:24 【问题描述】:

我目前正在训练自己的排序算法,但在快速排序字符串数组时遇到了问题。

我的代码如下所示:

#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)

我知道分段错误是由某种错误的指针使用引起的,但我认为我找不到我搞砸的地方。我哪里做错了?我该如何处理这个错误?

【问题讨论】:

“但我不认为我能找到我搞砸的地方” 在调试器中运行您的代码非常有助于找出答案。 您的数组“ary”只能存储 100 个字符串,但您会迭代直到输入文件的 EOF,因此存储字符串编号 101 会导致写入数组边界 这段代码可以正常编译,但我总是遇到段错误。 -- 编译是否正确与你的程序是否有错误无关。如果我们要获得没有错误的程序所要做的就是“正确编译”,那么任何程序都不会有错误。 【参考方案1】:

您将 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;
  ;

【讨论】:

谢谢,我解决了这个问题。 如果这是您问题的解决方案,请接受答案【参考方案2】:
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];

对于 100 个元素,从 0 到 99。 修改代码如下

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

避免在读取数据时崩溃。

【讨论】:

其实应该是while( !input &amp;&amp; i &lt; 100) @PaulMcKenzie,如果阅读下一个会导致崩溃,我不应该先检查一下,因为它会使!input 变得无关紧要吗?

以上是关于C ++快速排序从txt文件中读取的字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

Shell如何实现从文件中的第n行开始读取记录?

c语言排序和查找?

在 C/C++ 中快速读取多个文件的某些字节

如何在保持换行符的同时将 .txt 文件读入单个 Java 字符串?

oc如何提取文件中的第n行第n个字符 比如: hello, boy, girl, i love

C语言:对输入的十个数进行从小到大排序