Ошибка времени выполнения при обмене символами - PullRequest
0 голосов
/ 26 октября 2011
#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 голосов
/ 26 октября 2011

Есть намного лучшие способы сделать случайные перестановки. Вот пример, который я нашел в сети. Я позволил себе немного аннотировать код, чтобы объяснить, что происходит.


/* 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: ФОРМАТИРОВАНИЕ! Ааа .. всегда забывай о тех '<' s </p>

0 голосов
/ 26 октября 2011

Посмотрите на этот вызов функции:

permutate("abcdefgh",0);

Вы пытаетесь изменить строковый литерал.Они доступны только для чтения, и это источник segfault.

...