#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;
}
`
运行此程序时出现分段错误。交换功能在我自己运行时工作正常。
答案 0 :(得分:0)
看看这个函数调用:
permutate("abcdefgh",0);
您正在尝试修改字符串文字。这些是只读的,它是段错误的来源。
答案 1 :(得分: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;
}
这意味着你只需要遍历数组两次:一次构建它,一次来置换它。此外,每个排列具有相同的发生概率,如果你想在牌组中做一些像随机牌或者争抢一个单词的话,这就是目标。
编辑:记住,这个例子中的函数分配一个数组,但你可以很容易地将数组作为参数传入。
EDIT2:格式化!唉......总是忘记那些'&lt;'s