我得到错误"分段错误(核心转储)"当我运行这个程序。我是c编程的新手,所以它可能是愚蠢的东西,但我无法弄明白。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(char *x, char *y){
char temp = *x;
*x=*y;
*y=temp;
}
char** getPermutations(char *string){
int length = strlen(string);
int startIndex = 0;
int endIndex = length - 1;
if(startIndex == endIndex){
printf("%s\n", string);
}else{
for(int j = startIndex; j<=endIndex; j++){
swap((string + startIndex),(string + j));
getPermutations(string);
swap((string+startIndex),(string+j));
}
}
}
int main(int argc, char *argv[]){
if(argc>2){
printf("\nToo Many arguments\n");
exit(0);
}else{
printf("%s",argv[1]);
char * str = malloc(strlen(argv[1]) + 1);
strcpy(str,argv[1]);
getPermutations(str);
}
}
答案 0 :(得分:2)
您的问题是getPermutations
无休止地呼唤着自己。你需要传递额外的东西才能知道何时停止。就像它一样,它只是一遍又一遍地调用自己,直到你有一个堆栈溢出。
此外,您已getPermutations
设置为返回char**
,但之后您永远不会返回任何内容。所以这也很奇怪。
答案 1 :(得分:1)
我的建议:
将函数的返回类型更改为void
,因为它不会返回任何内容。
将函数名称更改为printPermutations
,因为它只是打印排列。
提供结束递归的方法。将startIndex
作为参数传递。
传递字符串的长度,这样每次递归调用函数时都不会计算它。
将比较运算符更改为>=
以考虑零长度字符串。
void printPermutations(char *string, int startIndex, int length){
int endIndex = length - 1;
if(startIndex >= endIndex){
printf("%s\n", string);
}else{
for(int j = startIndex; j<=endIndex; j++){
swap((string + startIndex),(string + j));
printPermutations(string, startIndex+1, length);
swap((string+startIndex),(string+j));
}
}
}
并将其命名为:
printPermutations(str, 0, strlen(str));