将一句话的单词进行倒置(C语言纯代码)

一、例题

将一句话的单词进行倒置,标点不倒置。比如 I like beijing.经过函数后变为:beijing.like I
示例1: 
输入
I like beijing.
输出
beijing.like I


二、统筹解析版 

#include <stdio.h>
#include <assert.h>

void reverse(char* l, char* r)
{
    assert(l && r);//检查指针是否位NULL
    while (l < r)
    {
        char tmp = *l;
        *l = *r;
        *r = tmp;
        l++;
        r--;
    }
}

int main()
{
    char arr[100] = { 0 };
    //输入
    gets(arr);
    int len = strlen(arr);
    //逆序
    //1. 逆序整个字符串
    char* left = arr;
    char* right = arr + len - 1;
    reverse(left, right);

    //2. 逆序每个单词
    char* cur = arr;
    char* start = arr;//一个单词的第一个字母的地址

    while (*cur != '\0')//循环到结尾
    {
        while (*cur != ' ' && *cur != '\0')//单词后空格或结尾停止,该循环过后直接去到单词最后一个字母的地址
        {
            cur++;
        }
        reverse(start, cur - 1);//逆序单词
        start = cur + 1;//初始指针跳到第二个单词上
        if (*cur != '\0')//如果不是末尾,cur指针跳到第二个单词上,重新开始第一个大循环
            cur++;
    }
    printf("%s\n", arr);//输出逆序数组

    return 0;
}

三、初学者易错分析重构版

#include<assert.h>
#include<stdio.h>

void reserve(char* left, char* right)
{
    assert(left && right);
    while (left < right)
    {
        char temp = *left;
        *left = *right;
        *right = temp;
        //指针在每次循环后要进行加位,否则不能调换这段字符串
        left++;
        //指针在每次循环后要进行减位,否则不能调换这段字符串
        right--;
    }
}


int main()
{
    //输入
    char arr[100] = { 0 };
    gets(arr);//gets函数输入可以存入包括空格在内的字符

    //整个数组逆序 - 设计一个函数reserve实现逆序
    //如何定义函数?
    char* left = arr;//这里的指针也要用char类型储存
    int len = strlen(arr) - 1;
    char* right = arr + len;
    reserve(left, right);

    //单词逆序
    char* start = arr;
    char* cur = arr;
    while (*cur != '\0')//while后面不用加;
    {
        while (*cur != ' ' && *cur != '\0')//这里既不可以是空格,也不可以是结尾,因此要用&&
        {
            cur++;
        }
        reserve(start, cur - 1);//这里跳出循环后,cur的值应该是空格或是'\0'
        start = cur + 1;
        //if (*cur != '\0')
        cur += 1;
    }

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

四、结语

我是计算机海洋的新进船长Captain_ldx,如果我的文章能对您有帮助的话,麻烦各位观众姥爷们点赞、收藏、关注我吧!如果你对我的文章有任何问题或者意见,欢迎在评论区给我留言。后期C语言的知识点将持续更新......

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值