逆转字符串中的单词

简述

        给定一个字符串,逐个翻转字符串中的每个单词。

思路

        1.  从后往前遍历,开始前先用两个变量i、j记住当前索引位置,每遍历一次i--,直到i<0退出循环;

        2.  当遍历过程中索引i位置的数值为' ',则开始把' '的后的位置i+1到j的值都赋值到新数组,最后再在尾部加上' ',表示这一轮赋值完成;

        3.  当要拷贝的字符串的首个字符不为' '时在while处理到最后一个' '时,并没有把最后一个单词给赋值进去就退出了循环,所以最后还是需要执行赋值操作的;

代码         

char s[] = " tom is  cat  ";
void reverseWord(const char *s)
{
    // 首先获取字符串的长度,并且开辟内存存放逆转后的字符
    int len = strlen(s);
    char *p = (char *)malloc(len + 1);

    // i:当前遍历的索引, j:从索引处开始需要拷贝的位置
    int i = len - 1, j = len - 1;
    while (i >= 0)
    {
        // 从后往前遍历字符串,遇到' ',则开始把' '的后的位置i+1到j的值都赋值到新数组
        if (s[i] == ' ')
        {
            for (int k = i + 1; k <= j; k++)
            {
                *p++ = s[k];
            }

            // 因为遇到的是' ',在拷贝完一个单词后,再把' '给加上
            *p++ = ' ';

            // 因为从后往前遍历,当前i的位置是' ',所以下一次要拷贝的位置不包括当前i,而是要往前一个字符
            j = i - 1;
        }

        i--;
    }

    // 退出循环后还需要判断i+1与k的值,如果成立还是需要执行赋值操作的
    // 因为当要拷贝的字符串的首个字符不为' ',时在while处理到最后一个' '时,
    // 并没有把最后一个单词给赋值进去就退出了循环
    for (int k = i + 1; k <= j; k++)
    {
        *p++ = s[k];
    }

    // len+1的目的就是为了在最后加上结束符 '\0'
    *p = '\0';

    // 由于p每次都是++,所以p当前指向的是字符串结尾,所以需要把指针指向头就得减去字符串长度
    p = p - len;
    qDebug() << p;

    free(p);
}

输出

  cat  is tom 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ilson_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值