• 【C语言】字符串逆序


    (来源:牛客网)

    题目

    将一个字符串str的内容颠倒过来,并输出。

    数据范围:1≤len(str)≤10000 

    输入描述:

    输入一个字符串,可以有空格

    输出描述:

    输出逆序的字符串

    示例1

    输入

    I am a student

    输出

    tneduts a ma I

    示例2

    输入

    nowcoder

    输出

    redocwon

    问题解析:

    逆置字符串和逆置数组本质是一样的,就是首、尾两个指针指向的内容交换,指针移动往中间推进,直到相遇。

     第一步

    首先我们得处理:输入字符串

    我们创建一个字符数组,因为数据范围:1≤len(str)≤10000 ,所以数组大小最好为10001而不是10000,预留一个'\0'的空间。

    char str[10001]={0};

    注意:scanf在读字符串时,遇到'\0'会结束,而我们的要求是输入可以有空格。所以写成下面这样是不行的。

    scanf("%s",str);

    为了解决这个问题,这时我们应该使用的函数是gets。它的头文件是stdio.h。

    gets可以无限读取,不会判断上限,从stdin流中读取字符串,以回车或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

    1. #include
    2. int main()
    3. {
    4. char str[10001];
    5. gets(str);//这样就能输入一个字符串(可有空格)到str中
    6. reverse(str);//将字符逆序封装为函数
    7. printf("%s\n",str);
    8. return 0;
    9. }
     第二步

     那么,现在问题就是,我们怎么来逆序呢(怎么写函数reverse)?

    我们传的是数组名,而数组名本身就是指针,所以属于传址调用,所以会改变main函数中数组str的内容,也就意味着我们的返回类型可以是void。

    我们就可以搭出函数的框架:

    1. void reverse(char str[])//or void reverse(char* str)
    2. {
    3. //
    4. }
     字符逆序的实现逻辑

    上面已经说了,其实就是创建两个指针,分别存放字符串的首字符地址和最后一个字符的地址,让其指向的内容交换,指针移动(往中间推进),直到相遇时停止。

    可能有人会想到先逆着遍历字符串,然后创建一个新的数组来接收,最后再打印出新数组。但这种方法,并没有前者好,因为要创建一个新数组,而且不如前者贴合题意。

    其中,把最后一个字符的地址赋给其中一个指针,需要我们先用strlen()求出字符串的长度:

    1. #include
    2. int len=strlen(str);
    3. char* left=str;
    4. char* right=&str[len-1];//char* right=left+len-1;

     指针移动就一个++,一个--:

    1. void reverse(char* str)
    2. {
    3. int len=strlen(str);
    4. char* left=str;
    5. char* right=&str[len-1];
    6. while(left<right)
    7. {
    8. char tmp;//创建中间变量来帮助交换
    9. tmp=*left;
    10. *left=*right;
    11. *right=tmp;
    12. left++;
    13. right--;
    14. }
    15. }

     

    完整代码参考:

    1. #include <stdio.h>
    2. #include<string.h>
    3. void reverse(char* str)
    4. {
    5. int len=strlen(str);
    6. char* left=str;
    7. char* right=&str[len-1];
    8. while(left<right)
    9. {
    10. char tmp;
    11. tmp=*left;
    12. *left=*right;
    13. *right=tmp;
    14. left++;
    15. right--;
    16. }
    17. }
    18. int main()
    19. {
    20. char str[10001]={0};
    21. gets(str);
    22. reverse(str);
    23. printf("%s",str);
    24. return 0;
    25. }

     

    到此,本文就结束了,祝阅读愉快^_^ 

  • 相关阅读:
    JEB反编译器crack版功能和选项
    leetcode 42. 接雨水(困难、单调栈的应用)
    中大型医院HIS系统源码 云HIS运维平台源码
    [附源码]计算机毕业设计体育器材及场地管理系统Springboot程序
    【完美世界】战王之殇特别篇定档,11月3日播,云曦受辱石昊杀红眼了
    TypeScript 介绍和开发环境搭建
    SAP PO运维(一):系统概览异常处理
    【5G物理层】5G 随机接入流程概述
    Linux Command —— cut / grep /sort /uniq /wc
    ActivityPub 笔记
  • 原文地址:https://blog.csdn.net/2301_82135086/article/details/139391449