#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char* c1,char* c2)
{
char temp=*c1;
*c1=*c2;
*c2=temp;
}
void permutate(char str[], int index)
{
int i = 0;
static lastChar = 0;
if(index == strlen(str))
{ // We have a permutation so print it
printf("%s\n",str);
return;
}
for(i = index; i < strlen(str); i++)
{
if(lastChar == str[i]) {
continue;
}
else {
lastChar = str[i];
}
swap(str+index, str+i); // It doesn't matter how you swap.
permutate(str, index + 1);
swap(str+index, str+i);
}
}
int main(int argc,char** argv)
{
permutate("abcdefgh",0);
return 0;
}
我得到一个分段错误运行此程序时。当我自己运行它时,交换功能正常工作。
真的这段代码太可怕了。从头开始写!切勿为此目的使用静态变量,将其作为指针参数传递。切勿在循环中调用strlen,每次对每个字符重复长度和此操作时都会进行计算,从而使计算复杂性变得很糟糕。算法本身是错误的,用于计算某些东西的函数内部的printf是可怕的,你总是要将输出的逻辑分开!如果我是你的老师,我会禁止你从课堂上学:)我没有降低,因为我知道学习可能很困难。 –
好的。其实我没有写这段代码,只是从一个网站上捡起来学习如何为一个字符串生成所有的排列。我同意你所说的,在for循环中使用strlen()是非常可怕的。甚至我不明白为什么静态变量已经被这样使用。就像我说的,我自己对这个程序不太了解,所以我没有太多修改。 –
无法理解的复制和粘贴更加糟糕。计算这个算法非常简单。但是,下次您发布新问题时,您还应该发布有关代码应该执行的每个细节,而不仅仅是代码本身。如果你正在学习C,我会建议你自己尝试解决这个问题,你会学到更多,当然你可以做得更好! –