倒置字符串题解!!超详细!!!

倒置字符串的要求,就是我们输入一串字符串:I like beijing.    (每个单词中间用一个空格分开)

我们要输出:beijing. like i      (以此类推!!!!)

我们的思路大概是这样子的:首先先把一整个字符串全部先逆序过来例如:I like beijing.

变成:.gnijieb ekil I      然后再把一段一段的单词分别再逆序一次,就可以达到最终的效果!

首先给大家放上完整的题解:如下

#include<stdio.h>
#include<string.h>
void reverse(char* left,char*right)
{
	while (left < right)
	{
		char tem = *left;
		*left = *right;
		*right = tem;
		left++;
		right--;
	}
}
int main()
{
	char arr[101];
	gets(arr);
	int len = strlen(arr);
	reverse(arr, arr +len-1);
	char* start = arr;
	char* cur = arr;
	while (*cur)
	{
		while (*cur != ' ' && *cur != '\0')
		{
			cur++;
		}
		reverse(start, cur - 1);
		start = cur + 1;
		if (*cur == ' ')
			cur++;
	}
	printf("%s\n", arr);
}

现在开始我们来一步一步了解我们是如何实现倒置字符串的

第一步:先读取用户输入的字符串,并且通过二分法的想法来写一个字符串逆序的函数,进行第一次的字符串整体逆序。(具体每一步的作用详细注释在代码里面了!!)

#include<stdio.h>//引用输入输出的一个标准头文件
#include<string.h>//由于下面需要用到strlen这个库函数,所以我们需要引一个他的头文件
void reverse(char* left,char*right)
//这边就是实现一个逆序函数,我们用left来接收字符串的起始地址,用right来接收字符串的末端地址
{
	while (left < right)
    //用二分法的思想只要left和right还没有交叉,就可以继续交换字符,
    //如果同时指向同一个字符,也可以不交换,因为他刚好是中间的那一个字符
	{
		char tem = *left;
		*left = *right;
		*right = tem;//以上三行代码就是实现字符串的单个字符交换

		left++;//交换完第一次,left需要重新指向下一个字符的位置,以便下一次交换
		right--;//交换完第一次,right需要重新指向前一个字符的位置,以便下一次交换
	}
}
int main()
{
	char arr[101];//先初始化一个字符串
	gets(arr);//读取用户输入的字符串,并存入arr中
	int len = strlen(arr);//这边是计算用户输入的字符串有多长,方便一会进行逆序
	reverse(arr, arr +len-1);//把字符串的起始地址,和末端地址传给逆序函数,进行第一次整体逆序

第二步:我们把整体函数逆序完成后,需要再把每个单词都分别单独逆序一遍

(具体每一步的作用详细注释在代码里面了!!)

    char* start = arr;//这个指针的作用是,记录每一个单词逆序的起始地址
	char* cur = arr;//这个指针的作用,记录每一个单词的末端地址的下一个位置
    while (*cur)
    //这个第一层的循环,为了保证每一次的单词逆序,
    //只要不是指向字符串的结束位置\0就继续执行下一个的单词逆序
	{
		while (*cur != ' ' && *cur != '\0')
        //这个第二层的循环是为了确定每一个单词的末端地址
        //当每一个单词的末尾遇到一个空格或者是\0时,证明这个单词结束了
        //可以开始执行这个单词的逆序了,就会退出循环开始执行下一步
		{
			cur++;//如果此时末尾不是空格或者\0,那么就再指向下一个位置查看
		}
        //跳出循环后,此时的start指向的就是这次这个单词的起始位置
        //cur指向的就是这次这个单词的末端位置的后面一个位置
		reverse(start, cur - 1);//进行此次的单词逆序,把单词的起始位置和末端位置传给逆序函数
		start = cur + 1;//把单词的起始位置换成下一个单词的起始位置
		if (*cur == ' ')
        //如果此时cur指向的是一个空格,证明后面还有单词,还没有结束
        //需要继续使cur重新指向下一个单词的起始位置,再一步步确定末端地址
        //如果此时cur指向的是一个\0,那就证明整个字符串到头了,结束了。不需要指向下一个了
			cur++;
	}
	printf("%s\n", arr);//最后打印出这个倒置过后的字符串!结束!
}

今天的分享就到这里,不知道有没有帮助到大家呢!

可以的话给我一个三连支持一下,谢谢大家!!

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr_biantao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值