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

简介: 【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在使用的时候的细节。

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

    如果本文有任何错误或者有疑点欢迎在评论区评论

    目录
    相关文章
    |
    1月前
    |
    存储 C语言 开发者
    【C语言】字符串操作函数详解
    这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
    79 10
    |
    2月前
    |
    存储 算法 C语言
    C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项
    本文深入探讨了C语言中常见的字符串处理技巧,包括字符串的定义、初始化、输入输出、长度计算、比较、查找与替换、拼接、截取、转换、遍历及注意事项,并通过案例分析展示了实际应用,旨在帮助读者提高编程效率和代码质量。
    147 4
    |
    3月前
    |
    C语言 C++
    【C语言】解决不同场景字符串问题:巧妙运用字符串函数
    【C语言】解决不同场景字符串问题:巧妙运用字符串函数
    |
    4月前
    |
    存储 C语言
    【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
    本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
    134 8
    |
    4月前
    |
    存储 Serverless C语言
    【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
    本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
    286 7
    |
    4月前
    |
    存储 人工智能 C语言
    C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
    本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
    178 4
    |
    4月前
    |
    C语言
    C语言 字符串操作函数
    本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
    |
    11天前
    |
    存储 算法 C语言
    【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
    本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
    50 23
    |
    11天前
    |
    算法 C语言
    【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
    本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
    43 15
    |
    11天前
    |
    C语言
    【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
    本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
    50 24

    热门文章

    最新文章