2011-10-26 44 views
-3
#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; 
} 

`运行时错误的字符

我得到一个分段错误运行此程序时。当我自己运行它时,交换功能正常工作。

+2

真的这段代码太可怕了。从头开始写!切勿为此目的使用静态变量,将其作为指针参数传递。切勿在循环中调用strlen,每次对每个字符重复长度和此操作时都会进行计算,从而使计算复杂性变得很糟糕。算法本身是错误的,用于计算某些东西的函数内部的printf是可怕的,你总是要将输出的逻辑分开!如果我是你的老师,我会禁止你从课堂上学:)我没有降低,因为我知道学习可能很困难。 –

+0

好的。其实我没有写这段代码,只是从一个网站上捡起来学习如何为一个字符串生成所有的排列。我同意你所说的,在for循环中使用strlen()是非常可怕的。甚至我不明白为什么静态变量已经被这样使用。就像我说的,我自己对这个程序不太了解,所以我没有太多修改。 –

+0

无法理解的复制和粘贴更加糟糕。计算这个算法非常简单。但是,下次您发布新问题时,您还应该发布有关代码应该执行的每个细节,而不仅仅是代码本身。如果你正在学习C,我会建议你自己尝试解决这个问题,你会学到更多,当然你可以做得更好! –

回答

0

看这个函数调用:

permutate("abcdefgh",0); 

您试图修改字符串文字。这些是只读的,它是段错误的来源。

0

有很多更好的方法来做随机排列。这是我在网上找到的一个例子。我冒昧地注释了一下代码来解释发生了什么。

 

/* this function generates an array containing a permutation of the numbers 0..n-1 */ 
int * rpermute(int n) { 

    /* first, create an array */ 
    int *a = malloc(n*sizeof(int)); 
    int k; 

    /* fill it in with the numbers 0..n-1 */ 
    for (k = 0; k < n; k++) 
    a[k] = k; 

    /* loop backward through the array */ 
    for (k = n-1; k > 0; k--) { 

    /* swap the k'th element with any element that comes before it (or itself) */ 
    int j = rand() % (k+1); 
    int temp = a[j]; 
    a[j] = a[k]; 
    a[k] = temp; 
    } 
    return a; 
} 
 

这意味着你只需要遍历数组两次:一次构建它,一次排列它。此外,每个排列都有相同的发生概率,如果你想要做一些事情,比如在牌组中洗牌,或者打字,这就是目标。

编辑:请记住,在这个例子中的函数分配一个数组,但你可以轻松地传递一个数组作为参数。

编辑2:格式化!唉..总是忘记那些'<的