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

 更新时间:2022年05月11日 16:11:07   作者:壮壮  
这篇文章主要为大家分享了几种通过C语言实现字符串字符反向排列(不是逆序打印)的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

前言

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

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

题目具体内容如下:

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

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

要求:不能使用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语言实现字符串字符反向排列的方法详解的文章就介绍到这了,更多相关C语言字符反向排列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ 学习之旅三 我和超级玛丽有个约会

    C++ 学习之旅三 我和超级玛丽有个约会

    学习了c++有一周有余了吧,感谢孙鑫老师的视频教程,让我   对C++有了基本的了解,并理解到C++与.net 的许许多多的区别,更要感谢网民为programaking的人,会为我提供了超级玛丽制作揭秘 这套宝贵的教程,让我 做做出了这个项目,对c++ 有了一个更深层次的认识
    2012-11-11
  • 基于Qt编写超精美自定义控件的示例代码

    基于Qt编写超精美自定义控件的示例代码

    无论是哪一门开发框架,如果涉及到UI这块,肯定需要用到自定义控件,本文为大家准备了一些基于QT编写的超精美自定义控件,需要的可以参考一下
    2023-07-07
  • C语言实现飞机小游戏

    C语言实现飞机小游戏

    这篇文章主要为大家详细介绍了C语言实现飞机小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 详解C语言中双指针算法的使用

    详解C语言中双指针算法的使用

    双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。本文将通过示例带大家深入了解双指针算法的使用
    2022-08-08
  • OpenCV4 实现背景分离的详细步骤(背景减法模型)

    OpenCV4 实现背景分离的详细步骤(背景减法模型)

    背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术,本文给大家介绍OpenCV4 实现背景分离的详细步骤,需要的朋友可以参考下
    2021-09-09
  • C++四种强制转换原理与价值

    C++四种强制转换原理与价值

    这篇文章主要介绍了C++的四种强制转换原理与价值,文中介绍的非常详细,对学习C语言有一定的参考价值,感兴趣的小伙伴可以参考一下
    2023-04-04
  • C++编程使用findfirst和findnext查找及遍历文件实现示例

    C++编程使用findfirst和findnext查找及遍历文件实现示例

    这篇文章主要为大家介绍了C++编程如何使用findfirst和findnext查找及遍历文件实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • C++浅析引用的定义与使用

    C++浅析引用的定义与使用

    引用是C++一个很重要的特性,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作完全等价,这篇文章主要给大家总结介绍了C++中引用的相关知识点,需要的朋友可以参考下
    2022-07-07
  • opencv3/C++绘制几何图形实例

    opencv3/C++绘制几何图形实例

    今天小编就为大家分享一篇opencv3/C++绘制几何图形实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 深入C++ 函数映射的使用详解

    深入C++ 函数映射的使用详解

    我比较喜欢用代码结合实际来讲解,下面我将以一段事例代码来讲解如何使用这几种映射
    2013-07-07

最新评论