Sort()导致Segmentation Fault

时间:2014-03-12 03:58:03

标签: c++ string stl

我必须实现一个shuffleString(string s,int d)方法,其中第一步涉及获取字符串中每个字符的计数,并按照其计数的递减顺序排列它们。我实现了如下所需的功能:

 struct node{
    char ch;
    int ctr;
 };
 bool myfunc(const struct node x,const struct node y){
    return (x.ctr>=y.ctr?true:false);
 }
 string shuffleString(string s,int d){
     int i,j;
     int len=s.size();
     vector<struct node> counter(26);
     for(i=0;i<26;i++){
         counter[i].ch='a'+i;
         counter[i].ctr=0;
     }
     for(i=0;i<len;i++){
         counter[s[i]-'a'].ctr++;
     }
     sort(counter.begin(),counter.end(),myfunc);//From STL's algorithm
     /*
       Remaining Functionality
     */
  }

但是,在调用segmentation fault方法时,代码会生成sort()。我的代码出了什么问题?请帮忙。

P.S。该字符串仅包含小写ASCII字符。

3 个答案:

答案 0 :(得分:0)

你可能在行中有内存损坏:counter [s [i] - 'a']。ctr ++;

s [i] - 'a'可以超过25,超出矢量边界。

答案 1 :(得分:0)

stl sort默认使用operator< - 它希望你传入的函数的行为方式相同。

这意味着如果它在两个相同的值上调用函数,它应该变为false,但在你的情况下它会变为真。因此,它将无法正确排序。

当您删除=该功能时,由于operator>不具有反身性,operator <

,因此不再出现此问题

如果使用debug c运行时运行,STL将首先声明传入的函数格式正确。

答案 2 :(得分:0)

试试这个

bool myfunc(const struct node x,const struct node y){ return (x.ctr>y.ctr) || (x.ctr == y.ctr && x.ch < y.ch); }

已编辑:

  1. 你应该处理断裂情况(单独的>==个案而不是>=
  2. 当输入除a-z以外的任何字符时,您的算法将失败(偶数A-Z
  3. 这里有一个小片段:

    struct node{
        char ch;
        int ctr;
    };
    bool myfunc(const struct node x,const struct node y){
        return (x.ctr>y.ctr) || (x.ctr == y.ctr && x.ch < y.ch);
    }
    void shuffleString(string s){
       int i,j;
       int len=s.size();
       vector<struct node> counter(26);
       for(i=0;i<26;i++){
          counter[i].ch='a'+i;
          counter[i].ctr=0;
       }
       for(i=0;i<len;i++){
          counter[s[i]-'a'].ctr++;
       }
       for(int i=0; i<26;i++) cout << counter[i].ch <<"," << counter[i].ctr  << endl;
    
       cout << endl << endl;
    
       sort(counter.begin(),counter.end(), myfunc);//From STL's algorithm
    
       for(int i=0; i<26;i++) cout << counter[i].ch <<"," << counter[i].ctr  << endl;
    
    }
    
    int main()
    {
       shuffleString("hello");
    
       return 0;
    }