目录
  • 前言
  • 非递归方法
    • 1.循环实现
    • 2.函数实现
  • 递归方法
    • 1.递归方法
    • 2.递归方法
  • 小结

    前言

    重点的话说在前头,注意不是逆序打印

    今天写题,碰到一个很好的题,在这里来个大家做个分享,我会用多种方法来解决

    题目具体内容如下:

    编写一个函数(递归实现)

    实现:将参数字符串中的字符反向排列,不是逆序打印。

    要求:不能使用C函数库中的字符串操作函数

    但是这里我不会仅仅局限于题目的要求

    非递归方法

    1.循环实现

    1.1循环实现(sizeof)

    #include <stdio.h>
    
    int main()
    {
        char arr[] = "abcdef";//[a b c d e f \0]
        int sz = sizeof(arr) / sizeof(arr[0]);//sizeof会算上\0
        int left = 0;
        int right = sz - 2;//-2 很关键
        while (left < right)
        {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
    
            left++;
            right--;
        }
        printf("%s\n", arr);
        return 0;
    }
    

    重难点:看代码给right赋值的那一行,为什么用的是sz-2?

    原因就是sizeof会计算字符串中的\0,会让计算的数组元素多1,这里需要减1,再加上数组第一位从0开始,再减1,故需要减2

    1.2循环实现(strlen)

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char arr[] = "abcdef";//[a b c d e f \0]
        int left = 0;
        int right = strlen(arr) - 1;//strlen不会算上\0
        while (left < right)
        {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
    
            left++;
            right--;
        }
        printf("%s\n", arr);
        return 0;
    }
    

    重难点:这里和1.1形成鲜明的对比,right只需要求出来的数减1,原因就在strlen不会计算字符串末尾的\0

    2.函数实现

    #include <stdio.h>
    #include <string.h>
    
    void reverse(char arr[])//arr[]和*arr是一个意思(都指的首元素地址)
    {
        int left = 0;
        
        //int sz = sizeof(arr) / sizeof(arr[0]);
        //int right = sz - 2;//这里通过函数调用的方式时,在函数内部使用sizeof不行,会出错。。。。。。详见相关博客
        int right = strlen(arr) - 1;//strlen不会算上\0
        
        while (left < right)
        {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
    
            left++;
            right--;
        }
    }
    
    int main()
    {
        char arr[] = "abcdef";
        reverse(arr);
        printf("%s\n", arr);
        return 0;
    }
    

    重难点:第一个(是我自己一开始没有理解的),这里的arr[]和*arr是一个意思(都指的首元素地址),也就是说,是一个意思,两种写法而已。

    第二个,这里的不能通过函数调用的方式时,在函数内部使用sizeof计算会出错,因为数组传参传进去的只是首元素的地址,故无法准确计算出来。

    这里sizeof具体解释我找到了一个写得蛮好的文章,分享给大家

    递归方法

    1.递归方法

    结果和题目一致,但是不满足题目所给要求,这里只是思路比较简单

    #include <stdio.h>
    #include <string.h>
    
    void reverse(char arr[], int left, int right)
    {
        if (left < right)
        {
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            reverse(arr, left + 1, right - 1);
        }
    }
    
    int main()
    {
        char arr[] = "abcdef";//[a b c d e f \0]
        int left = 0;
        int right = strlen(arr) - 1;
        reverse(arr,left,right);
        printf("%s\n", arr);
        return 0;
    }
    

    重难点:第一这里使用了库函数strlen

    第二这里自定义的函数使用了三个参数

    但是!这个思路非常清晰明了

    2.递归方法

    完全满足题目要求,这里需要注重理解了,思路很重要

    #include <stdio.h>
    
    int my_strlen(char* str)
    {
        int count = 0;
        while (*str != '\0')
        {
            count++;
            str++;
        }
        return count;
    }
    
    void reverse(char* str)
    {
        int len = my_strlen(str);
        char tmp = *str;//1
        *str = *(str + len - 1);//2
        *(str + len - 1) = '\0';//3
        if (my_strlen(str + 1) >= 2)
            reverse(str + 1);//4
        *(str + len - 1) = tmp;//5
    }
    
    int main()
    {
        char arr[] = "abcdef";//[a b c d e f \0]
        reverse(arr);
        printf("%s\n", arr);
        return 0;
    }
    

    重难点:第一:这里我们便可以自定义一个和strlen功能类似的函数即可

    第二:是本文最难的地方,我放一张图片,大家看看整体思路,一共五步,对应着五步代码

    C语言实现字符串字符反向排列的方法详解

    小结

    一道题目,如果每天太多限制条件的话,解决的方法是有很多的,一千个人可以写出一千种形式。所以以上只是一些胡思乱想

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。