C++ 生成字典排列:分段错误

C++ 生成字典排列:分段错误,c++,c,segmentation-fault,permutation,lexicographic,C++,C,Segmentation Fault,Permutation,Lexicographic,我有这个代码来生成字典排列。使用以下逻辑: 从给定测试字符串中字符的递增顺序排列开始 要生成下一个词典排列,请执行以下操作: a) 查找比下一个字符小的最右边的字符。说A b) 在A的右侧,找到下一个较大的字符。说B,交换A和B c) 在原始位置的右侧,按递增顺序对字符进行排序 当我们得到最后一个置换时,算法结束。i、 e.给定测试字符串的反向。 我的测试字符串s=“0123456789” 编辑: 每次运行程序时,我都会得到一个单独的分段错误位置。 要获得一个: int firstchar(st

我有这个代码来生成字典排列。使用以下逻辑:

  • 从给定测试字符串中字符的递增顺序排列开始
  • 要生成下一个词典排列,请执行以下操作:
  • a) 查找比下一个字符小的最右边的字符。说A

    b) 在A的右侧,找到下一个较大的字符。说B,交换A和B

    c) 在原始位置的右侧,按递增顺序对字符进行排序

    当我们得到最后一个置换时,算法结束。i、 e.给定测试字符串的反向。 我的测试字符串
    s=“0123456789”

    编辑: 每次运行程序时,我都会得到一个单独的分段错误位置。

    要获得一个:

    int firstchar(string s){
    int pos = s.length()-2;
    for(int i=pos;i>=0;i--){
        if(s[i]<s[i+1]){
            pos = i;
            break;
        }
    }
    return pos;}
    
    int firstchar(字符串s){
    int pos=s.长度()-2;
    对于(int i=pos;i>=0;i--){
    
    如果(s[i]我怀疑您的堆栈大小超过了限制。如果您在Linux上运行它,请执行“限制”并查看堆栈大小。有两种方法可以避免这种情况

    1) (不建议)执行“limit stacksize unlimited”(仅当您在基于unix的系统上时)。然后再次运行该程序

    2) (推荐)

    改变

    void nextpermute(string& s){
        int fc = firstchar(s);
        int cc = ceilchar(s,fc);
        swap(s,fc,cc);
        sort(&s[fc]+1,&s[fc]+s.length()-fc);
        if(s!="9876543210"){
            cout<<s<<"\n";
            nextpermute(s);
        }
        else
            cout<<s<<"\n";
    }
    

    上面的更改将消除“nextpermute”的递归,因此您的堆栈大小限制将永远不会超过std::next_permutation
    有什么问题吗?@chris我正在尝试自己解决这个问题。一旦通过,我肯定会使用它,为什么您将
    strcmp
    s.c_str()
    而不是
    操作符==
    s
    ?您已经成功地获取了安全代码并使其不安全。哦,是的!我刚刚忘记了,我可以直接比较字符串对象。无论如何,这仍然不能解决我的问题。如果您遇到seg错误,您应该在调试器中运行代码,以确定哪一行导致pro错误问题。然后从那里向后工作。是的,我将代码更改为迭代过程!成功了,顺便问一下,我如何/在何处编写“limit stacksize unlimited”?在启动二进制文件之前,必须在shell中发出命令。顺便说一句,limit是csh/tcsh命令。如果您在bash上,请执行“ulimit-s unlimited”
    void nextpermute(string& s){
    int fc = firstchar(s);
    int cc = ceilchar(s,fc);
    swap(s,fc,cc);
    sort(&s[fc]+1,&s[fc]+s.length()-fc);
    if(s!="9876543210"){
        cout<<s<<"\n";
        nextpermute(s);
    }
    else
        cout<<s<<"\n";}
    
    void nextpermute(string& s){
        int fc = firstchar(s);
        int cc = ceilchar(s,fc);
        swap(s,fc,cc);
        sort(&s[fc]+1,&s[fc]+s.length()-fc);
        if(s!="9876543210"){
            cout<<s<<"\n";
            nextpermute(s);
        }
        else
            cout<<s<<"\n";
    }
    
    void nextpermute(string& s){
        int fc = firstchar(s);
        int cc = ceilchar(s,fc);
        swap(s,fc,cc);
        sort(&s[fc]+1,&s[fc]+s.length()-fc);
        cout <<s<<"\n";
    }
    
    int main()
    {
        string s = "0123456789";
        while (s != "9876543210")
        {
            nextpermute(s);
        }
    }