字符串3步翻转法

一.先上全部代码,再进行逐一分析

过程简单概括为

1.先逆序整个字符串。

2.再逐一逆序单个单词。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

void reverse(char *left,char *right)
{
    while (left < right)
    {
        char tmp = 0;
        tmp = *left;
        *left = *right;
        *right = tmp;
        right--;
        left++;
    }
}


int main()
{
    char arr[100] = { 0 };
    gets(arr);
    //散步翻转法
    //1.先颠倒整个字符串,再颠倒字符。
    //获取字符创的首地址和末地址
    int sz = strlen(arr);  
    //这里求出的是字符串的总长度,但是如果要获取正确的下标,必须在长度上-1,因为下标是从0开始的
   
     reverse(arr, arr + sz - 1);

    //2.再逐个颠倒字符串
    char* st = arr;
    while (*st)
    {
        char* ed = st; //*st是取对应地址的值来使用,st则是取st中存储的地址来使用。
        while (*ed != ' ' && *ed !='\0')
        {
            ed++;
        }
        reverse(st, ed - 1);

        if (*ed == ' ')
            st = ed + 1;
        else
            st = ed;
    }



    printf("%s", arr);
    return 0;
}

  1. 利用Strlen功能函数求出字符串的总长度

 int sz = strlen(arr);  
    //这里求出的是字符串的总长度,但是如果要获取正确的下标,必须在长度上-1,因为下标是从0开始的

2.利用自建函数先逆序整个字符串

//void reverse(char *left,char *right)自建函数

reverse(arr, arr + sz - 1);//传址调用

//跳转到函数内部如下
void reverse(char *left,char *right) //两个指针形参变量来接受两个地址。
{
    while (left < right) //内存中,地址是由低到高的,字符串的地址一般来说也是由低到高
    {                   //换成成功后,低地址自增,高地址自减
                       //直到条件不成立结束循环后,整个字符串即逆序成功
        char tmp = 0;
        tmp = *left;
        *left = *right;
        *right = tmp;
        //以上三步为  right与left的想互换
        //互换成功后,低地址自增,高地址自减。
        right--;
        left++;
    }
}

3.逐一逆序单个字符串。

 //2.再逐个颠倒字符串
    char* st = arr; //先将字符串的首地址赋给指针变量st
    while (*st) //建立逆序循环,只要*st不是'\0',则一直进行逆序到字符串结束,
    {            // '\0'为字符串结束标志

        char* ed = st; 
        //*st是取对应地址的值来使用,st则是取st中存储的地址来使用。
        //创建一个指针变量 ed 将开始地址赋给ed

        while (*ed != ' ' && *ed !='\0')
        {  //条件判断为 如果*ed不为空格并且字符串结束标志'\0'
           //ed++,直到碰到对应条件 *ed不为空格和字符串结束标志'\0',即停止自增
            ed++;
        }

        //停止自增后,代表ed已经找到单个单词或字符串结束标志,开始进行逆序。
        reverse(st, ed - 1);

        //如果ed 等于空格 则重置st到空格后开始逆序下一次单词
        //如果不是则肯定已经是字符串结束标志,直接结束逆序
        if (*ed == ' ')
            st = ed + 1;
        else
            st = ed;
    }

 printf("%s", arr); //打印整个逆序后的字符串。
完结撒花
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值