C程序实现单词逆序

题目:编写一个C函数, 将”I am from shanghai!”倒置为”shanghai! from am I”, 即将句子中的单词位置倒置,而不改变单词内部结构。

思路:首先把整个字符串逆序,接下来分别逆序每个单词。

实现代码:

#include <stdio.h>
#include <string.h>

void swap(char *a, char *b) // 交换函数
{
    char tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;
}

void str_rev(char *begin, char *end) // 逆序函数
{
    while (begin < end)
    {
        swap(begin, end);

        begin++;
        end--;
    }
}

void word_rev(char *str) // 单词逆序函数
{
    char *begin = str; // begin指向单词的首个字符
    char *end = begin;

    while (*begin) // 如果begin指向\0,结束循环
    {
        while (*end != ' ' && *end != '\0') // 如果end指向不是空格或\0,则继续往后偏移
        {
            end++;
        }

        str_rev(begin, end - 1); // end - 1表示end指向空格或者\0前的字符,也就是单词的末尾 

        begin = end + 1; // begin指向下一个单词的首位
        if (*end != '\0') // 如果不指向\0,则end指向下个单词的首个字符
        {
            end++; 
        }
    }
}

int main()
{
    char str[] = "I am from shanhai!";
    int len = strlen(str);

    puts(str);
    str_rev(str, str + len - 1);
    word_rev(str);
    puts(str);

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值