目前,我正在做w3resource关于指针的练习。请帮助我解释charPermu的参数,以及为什么在主代码中给出它(str,0,n-1)?
#include <stdio.h>
#include <string.h>
#define MAX 4
void changePos(char *ch1, char *ch2){
char tmp;
tmp = *ch1;
*ch1 = *ch2;
*ch2 = tmp;
}
void charPermu(char *cht, int stno, int endno){
int i;
if(stno == endno){
printf("%s ", cht);
} else{
for(i = stno; i<= endno; i++){
changePos((cht+stno), (cht+i));
charPermu(cht, stno+1, endno);
changePos((cht+stno), (cht+i));
}
}
}
int main(){
char str[MAX];
printf("\n\n Pointer : Generate permutations of a given string :\n");
printf("--------------------------------------------------------\n");
printf("Enter a string to permutate: ");
scanf("%[^\n]", str);
int n = strlen(str);
printf("The permutations of the string are: ");
charPermu(str, 0, n - 1);
printf("\n\n");
return 0;
}
发布于 2022-07-16 11:17:39
哇,对于一个教程来说,这是一个糟糕的变量命名。让我们给出更有用的名称:
#include <stdio.h>
#include <string.h>
#define MAX_STRING_LENGTH 4
void swapCharacters(char *ch1, char *ch2){
char tmp;
tmp = *ch1;
*ch1 = *ch2;
*ch2 = tmp;
}
void printPermutations(char *fullString, int startingOffset, int endingOffset){
int nextOffset;
if(startingOffset == endingOffset){
printf("%s ", fullString);
} else{
for(nextOffset = startingOffset; nextOffset<= endingOffset; nextOffset++){
swapCharacters((fullString+startingOffset), (fullString+nextOffset));
printPermutations(fullString, startingOffset+1, endingOffset);
swapCharacters((fullString+startingOffset), (fullString+nextOffset));
}
}
}
int main(){
char input[MAX_STRING_LENGTH];
printf("\n\n Pointer : Generate permutations of a given string :\n");
printf("--------------------------------------------------------\n");
printf("Enter a string to permutate: ");
scanf("%[^\n]", input);
int stringLength = strlen(input);
printf("The permutations of the string are: ");
printPermutations(input, 0, stringLength - 1);
printf("\n\n");
return 0;
}
这些名字可能并不完美,但至少它们读起来是英语。请永远记住,变量名是为了帮助人类的读者,而不是计算机。
现在我们可以查看参数,并看到:
thing
的结束时间。
其思想是,函数的每一次执行都交换一个字符,然后调用自己来生成字符串其余部分在该点之后的所有排列。
因此,当startingOffset为零时,for循环依次将字符串的每个字符放在第一位,然后为递归调用“修复”第一个字符;然后循环遍历第二位的每个可能的字符(偏移量1),然后修复该字符,依此类推。一旦所有字符都是“固定的”,开始和结束偏移将是相同的,我们打印的结果和返回,继续用不同的组合。
https://stackoverflow.com/questions/73003563
复制相似问题