交换字符时出现运行时错误

时间:2011-10-26 17:26:30

标签: c segmentation-fault

#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 个答案:

答案 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