C语言实现字符逆序(来源 牛客网)

题目:将一句话的单词进行倒置,标点不倒置,例如:I like Beijing. 倒置后变成Beijing. like I
输入描述:输入一个仅包含小写字母,空格,‘.'的字符串,长度不超过100,'.'只出现在最后一个单词的末尾。
输入:I like Beijing.
输出:Beijing. like I

💭 注意:

字符串输入时,不能使用scanf函数,应该使用gets来输入字符串,因为scanf函数遇到空格就会停止读取。

思路

1.先将字符串逆序,“I like Beijing.“变成“.gnijieB ekil I"。之后将每个单词逆序,最后得到我们的结果。“Beijing. like I”

逆序字符串操作:

#include <assert.h>
#include <string.h>

void reverse(char* left, char* right)
{
    assert(left && right);//用assert断言,保证指针有效
    while (left < right)
    {
        char tmp = 0;
        tmp = *left;
        *left = *right;
        *right = tmp;
        left++;//地址+1或者-1都是指向下一个字符
        right--;
    }
}
int main()
{
    char arr[101] = { 0 };
    gets(arr);
    int len = strlen(arr);
    //逆序整个字符串
    reverse(arr, arr + len - 1);//起始地址+字符个数-1就是最后一个字符的地址
    printf("%s", arr);
    return 0;
}

2.逆序每一个单词

逆序每一个单词实质上也是继续执行上述字符串逆序的操作。而执行字符串逆序操作的基本就是我们要找到要逆序这一部分单词的起始地址和终止地址。

char* cur = arr;//数组名就是首元素地址
    while (*cur)//循环条件不为\0
    {
        char* start = cur;//记录起始地址
        while (*cur != ' '&&*cur!='\0')
        {
            cur++;//找到空格,空格前面就是我们要逆序的第一个单词
        }
        reverse(start, cur - 1);//逆序单词
        if(*cur==' ')
           cur++;//继续向下逆序单词
    }

很重要!!!

在这里要特别强调,本人在写这里时犯糊涂了!!!

整体代码

#include <assert.h>
#include <string.h>

void reverse(char* left, char* right)
{
    assert(left && right);//用assert断言,保证指针有效
    while (left < right)
    {
        char tmp = 0;
        tmp = *left;
        *left = *right;
        *right = tmp;
        left++;//地址+1或者-1都是指向下一个字符
        right--;
    }
}
int main()
{
    char arr[101] = { 0 };
    gets(arr);
    int len = strlen(arr);
    //逆序整个字符串
    reverse(arr, arr + len - 1);//起始地址+字符个数-1就是最后一个字符的地址
    char* cur = arr;//数组名就是首元素地址
    while (*cur)//循环条件不为\0
    {
        char* start = cur;//记录起始地址
        while (*cur != ' '&&*cur!='\0')
        {
            cur++;//找到空格,空格前面就是我们要逆序的第一个单词
        }
        reverse(start, cur - 1);//逆序单词
        if(*cur==' ')
           cur++;//继续向下逆序单词
    }
    printf("%s", arr);
    return 0;
}
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mikk-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值