首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这篇摘录来自w3resource。如何在主代码中找出charPermu的工作,特别是指针参数,请

这篇摘录来自w3resource。如何在主代码中找出charPermu的工作,特别是指针参数,请
EN

Stack Overflow用户
提问于 2022-07-16 10:52:14
回答 1查看 34关注 0票数 2

目前,我正在做w3resource关于指针的练习。请帮助我解释charPermu的参数,以及为什么在主代码中给出它(str,0,n-1)?

代码语言:javascript
运行
复制
#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;
    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-16 11:17:39

哇,对于一个教程来说,这是一个糟糕的变量命名。让我们给出更有用的名称:

代码语言:javascript
运行
复制
#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

  • fullString始终是指向内存中字符串开头的指针;我们需要这样做,因为即使我们只是在更改字符串的一部分,我们也希望在第一次调用函数时输出完整的为零--没有偏移量,因此字符串中的第一个字符每次递归调用时都会增加一次--每次递归调用itself
  • endingOffset总是将其设置为字符串中的最后一个字符--对于字符串中的最后一个字符,偏移量为3将得到最后一个字符;它使我们能够检测到字符串

的结束时间。

其思想是,函数的每一次执行都交换一个字符,然后调用自己来生成字符串其余部分在该点之后的所有排列。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73003563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档