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