下面给出的代码打印给定字符串的所有可能组合。它以递归方式生成字符串。现在我想使用指向每个字符串的指针数组将每个组合存储在一个数组中。我如何初始化指针,使其指向字符串。 代码是: -
Input ABC
Output
ABC in b[0]
ACB in b[1]
BAC
BCA
CAB
CBA
等等。
谢谢:)
void permute(char *a, int i, int n)
{
int k=0;
char *b[100];
int j;
if (i == n)
{
// *b[k]=a;
printf("%s\n", a);
i++;
}
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
答案 0 :(得分:0)
将b
指向a
的元素没有任何意义,因为a
是变量字符串(也就是说,它会不断变化)。此类代码的可能输出是b
的所有元素都将是字符串a
的最后一个排列。
每次找到新的排列时,都需要动态分配字符串。
您可以使用malloc()
手动执行此操作。或者可以使用strdup()
为您创建重复的字符串(请记住在课程结束时free()
)。
/*Sample Code*/
if (i == n)
{
b[k] = strdup(a);
...
}
请记住,您还需要将k
作为参数传递给函数permute()
,因为k
是一个自动变量,新创建的值为0
,每次调用函数permute()
。还有其他可能性,请k
global
或static
变量。
答案 1 :(得分:0)
您可以动态分配一个数组,该数组将包含代表每个排列的单个char数组(或C字符串)。使该代码通用的一个原因是在main()中找到具有strlen N的给定字符串中total_permutations的值,该字符串实际上是阶乘(N)。在这里:
void swap(char* A, char* B) {
char t;
t = *A;
*A = *B;
*B = t;
}
int permute(char **arr_of_chars, int count, char *a, int i, int n)
{
int k=0;
char *b[100];
int j;
if (i == n) {
// *b[k]=a;
printf("%s\n", a);
memcpy(arr_of_chars[count], a, strlen(a));
count++;
i++;
} else {
for (j = i; j <= n; j++) {
swap((a+i), (a+j));
count = permute(arr_of_chars, count, a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
return count;
}
int main() {
char str[] = "";
char **arr_of_str = NULL;
int len_str = strlen(str);
int i = len_str;
int total_permutations = 1;
while (i > 0) { /* Get all the combinations */
total_permutations *= i;
i--;
}
arr_of_str = (char **) malloc(total_permutations * sizeof(char*));
for (i=0; i <total_permutations; i++) {
arr_of_str[i] = (char *) malloc(sizeof(char) * len_str);
}
permute(arr_of_str, 0, str, 0, (len_str-1));
for (i=0; i <total_permutations; i++) {
printf("%s \n", arr_of_str[i]);
free(arr_of_str[i]);
}
free(arr_of_str);
}