字符串逆序(二)

二、按单词逆序
给定一个字符串,按单词将字符串逆序。例如,给定 ” I am a student “,则输出是 “student a am I “,为了简化问题,字符串中不包含标点符号。一共分两个步骤,第一步先按单词逆序得 ” I ma a tneduts”,第二步整个句子逆序得到 “student a am I “。

#include <iostream>
using namespace std;

void ReverseWord(char *p, char *q)
{
    while (p < q) // 注意点1
    {
        char temp = *q;
        *q-- = *p;
        *p++ = temp;
    }
}

char *Reverse(char *s)
{
    char *p = s;
    char *q = s;

    while (*q != '\0')
    {
        if (*q == ' ')
        {
            ReverseWord(p, q - 1); // 遇到空格,就反转空格之前的部分(即从p到q-1部分的字符)。
            q++; // 跳过当前空格; 注意点2
            p = q; // 将当前空格后的那个字符,作为p的新位置。
        }
        else
            q++;
    }

    ReverseWord(p, q - 1); // 反转字符串'\0'之前的那部分子串。

    ReverseWord(s, q - 1); // 所有的单词都逆序后,将整个句子看成一个整体,即一个包含空格的单词,再逆序一次即可。

    return s;
}

int main(int argc, const char * argv[]) {

    char str[] = "I am a student";
    char *s = Reverse(str);

    printf("%s\n", s);

    return 0;
}

三、字符串的逆序打印
即只要求逆序输出,不要求逆序存储。
(1)可以先反转字符串,再顺序输出。
(2)先求字符串长度,然后反向遍历即可。(使用下标)
(3)先遍历到末尾,然后再遍历回来,需要借助字符串的 ‘\0’。(使用指针)
(4)递归。
下面仅对递归方法做简要描述:

void ReversePrint(char *s)
{
    if (*(s+1) != '\0')
        ReversePrint(s+1); // 此处不能使用s++,因为会改变s,应使用s+1printf("%c", *s);
}

补充一个小知识点:
char str[] = “Student”;
char *str = “Student”;
不论是字符数组,还是字符串常量,(*str)都代表当前字符串的首个字符,即 S。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值