【C语言】字符串逆序与三步翻转法(倒置字符串)

前言
🎈大家好,我是何小侠🎈
🍃大家可以叫我**小何或者小侠🍃**
💐希望能通过写博客加深自己对于学习内容的理解💐
🌸也能帮助更多人理解和学习🌸

《小松》 杜荀鹤
自小刺头深草里,而今渐觉出蓬蒿。
时人不识凌云木, 直待凌云始道高。

在这里插入图片描述


    这篇博客我们一起来简单的了解一下,C语言中经典的例题和方法——逆序字符串和三步翻转法,希望大家能有所收获。

    在这里插入图片描述

    题目与思路🍊

    在这里插入图片描述
    这是原链接: link

    在这里插入图片描述
    其实我们只需要用两个指针分别指向字符最前端和最后端就行,然后创建一个临时变量用作交换的变量,每次交换后指针移动就行了。
    在这里插入图片描述
    我们只需要交换一次后,left++一次,right–就行,但是如何找到字符’ t '呢?
    我们知道strlen函数,可以求\0之前的字符个数,可以利用这一点来确定right指针的位置。

    下面我们给出代码

    void reverse(char* str)
    {
        int len = strlen(str);
        char* left = str;
        char* right = str + len - 1;
        while (left < right)
        {
            char tmp = 0;
            tmp = *left;
            *left = *right;
            *right = tmp;
            right--;
            left++;
        }
    }
    
    int main()
    {
    
    
        char arr[101] =  "I am a student";
        reverse(arr);
        printf("%s", arr);
    
        //char arr[101] = {0};
        多组输入版本
        //while (fgets(arr, 101, stdin)!=EOF)
        //{
        //    reverse(arr);
        //    printf("%s\n", arr);
        //    memset(arr, '0', 101);
        //}
    
        return 0;
    }
    

    这里我们也给出多组输入版本,fgets也可以用来代替gets or gets_s,
    其实在最后的memset没有太大的作用,不要也可以,因为fgets会直接改变数组的内容,但是加上更好~

    但是实际上我们具体说的重点不在这里。

    倒置字符串题目🍊

    先看题目
    在这里插入图片描述

    思路🍊

    在这里插入图片描述
    思路虽然简单,但是实现起来还是有区别的,实现时也需要一些细节。

    代码和讲解🍊

    下面的代码也被称为三步翻转法

    #include<string.h>
    void reverse(char* str1,char * str2)
    {
       
        char* left = str1;
        char* right = str2;
        while (left < right)
        {
            char tmp = 0;
            tmp = *left;
            *left = *right;
            *right = tmp;
            right--;
            left++;
        }
    }
    
    
    void inverted_str(char* arr)
    {
        reverse(arr, arr + strlen(arr)-1);
        char* str1 = arr;
        char* str2 = arr;
        while (* str2 != '\0')
        {
            while (*str2 != ' ' && *str2 != '\0')
            {
                str2++;
            }
            char* cur = str2 - 1;
            reverse(str1, cur);
            if (*str2 != '\0')
            {
                str2++;
            }
            str1 = str2;
    
        }
    
    }
    
    int main()
    {
    
        //char arr[] = "I like beijing.";
        char arr[100] = { 0 };
        //scanf("%[^\n]", arr);
        
        gets_s(arr, 100);//注意最高输入99个字符,最后一个字符gets_s会补\0
      
        inverted_str(arr);
        printf("%s", arr);
    
    
    
    }
    

    那我们就来仔细讲解一下这段代码中的细节,首先
    我们知道scanf是不能用来输入字符串的,但是如果你采用这种写法,scanf就会在\n之前停下来,

    还有如果gets无法使用时gets_s使用的细节,gets_s会补\0在输入的字符串后,所以我们要注意输入的字符长度不要超过gets_s的参数的数字。
    主要还是讲解
    inverted_str(arr)
    倒置字符串这个函数,
    在一开始我们就需要逆序一下字符串,

    然后我们用两个指针来接收,我们的思路是用str2这个指针来判断空格,
    然当str2指针在第二个while循环停下时,指向的就是space,但是我们的reverse
    函数需要传两个参数,那么要让str2函数退后一步吗?
    不!我们直接用一个cur指针来接收str2-1的值,也就是指向space的前一个字符
    再输入合适的参数就行,
    但是在我们让str2++的过程中最后会遇到\0所以我们需要多加一个
    限制条件在第二个while的条件判断中。
    再来看reverse一个单词该怎么办,肯定需要从space的下一个字符开始
    所以我们让还在指向space的str2++,但是这个str2还是有条件,当到字符串最后的时候
    str2肯定就会指向\0,所以我们也要加限制条件,不然就会越界访问,形成野指针。
    当str2指向spaceh后面一个字符时str1也需要被赋值成str2的地址这样才算又重新开始

    总结🍊

    这篇博客我们介绍了字符串逆序和三步翻转法,但是我们还介绍了很多细节,比如fgets用来多组输入,scanf用来接收字符串的奇葩方式,gets_s在使用的时候的细节。
    在这里插入图片描述

    最后如果这篇博客有帮助到你,欢迎点赞关注加收藏

    在这里插入图片描述在这里插入图片描述
    如果本文有任何错误或者有疑点欢迎在评论区评论
    在这里插入图片描述

    在这里插入图片描述

    • 15
      点赞
    • 9
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 3
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论 3
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    He XIAO xia

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值