目前,我正在做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;
    
}

推荐答案

哇,对于一个教程来说,这是terrible个变量命名.让我们给事物起个更有用的名字:

#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;
    
}

这些名字可能并不完美,但至少读起来是英文的.永远记住,变量名是为了帮助人类读者,而不是计算机.

现在我们可以查看参数,并看到:

  • fullString始终是指向内存中字符串开头的指针;我们需要这个,因为即使我们只是字符串的changing个部分,我们也要print个完整的部分
  • 第一次调用函数时,startingOffset为零-没有偏移,因此字符串中的第一个字符-并且每次递归调用自身时增加一个
  • endingOffset始终保持设置为字符串中的最后一个字符-对于4个字符的字符串,偏移量为3表示最后一个字符;它可以让我们检测何时到达字符串的末尾

其思想是,函数的每次执行交换one个字符,然后调用自身来生成the rest of the string after that point的所有排列.

因此,当startingOffset为零时,for循环将字符串的每个字符依次放在第一位,然后为递归调用"修复"第一个字符;然后将在每个可能的字符上循环second个位置(偏移量1),并修复该位置,依此类推.一旦所有字符都"固定",开始和结束偏移量将相同,我们打印结果并返回以不同的组合继续.

C++相关问答推荐

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

为什么我得到更多的256假阳性在PKZIP解密密钥验证?

va_copy的使用是未定义的行为吗?

正在try 将文件/文件夹名从目录 struct 存储到链接列表

创建一个fork导致fget无限地重新读取文件

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

从纯C中访问通用项对话框

致命:ThreadSaniizer:在Linux内核6.6+上运行时意外的内存映射

加密解密工作正常,但返回错误0x80090005

如何使解释器存储变量

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

如何用c语言修改shadow文件hash部分(编程)?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

生产者消费者计数器意外输出的C代码

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

为什么GCC 13没有显示正确的二进制表示法?

C:面筋蛋白';为什么不刷新窗口?

在哪里可以找到叮当返回码的含义?

GDB 跳过动态加载器代码

添加/删除链表中的第一个元素