练习--字符串逆序 -- (逆序完成后单词顺序不变)


✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。


前言

本篇是练习字符串逆序,用到了两次逆序,希望能帮助开阔小伙伴的思路如有错误,请在评论区指正,让我们一起交流,共同进步!

本文开始

1.题目内容

给定一个非空字符串,输出该字符串的逆序字符串.(字符串中可含有空格),给定I like beijing. 逆序完成后 beijing. like I

输入:I like beijing.
输出:beijing. like I

1.1思路

如果只是字符串逆序,我们可能只是得到 .gnijieb ekil I ,但是我们需要 beijing. like I ,保证单词顺序不变,我们可以①先逆序每个单词得到 I ekil .gnijieb,②再逆序整个字符串得到beijing. like I. 或者我们也可以先逆序整个字符串,在逆序每个单词.

1.2编写代码

准备逆序函数:我们需要逆序单词时直接调用传入单词首尾即可

逆序需要我们知道首尾下标,所以我们就需要参数left,right.
我们用指针来移动下标,每个单词left指向的字符,与right指向的字符交换,再使指针left++(左指针),指针right–(右指针),当left不再小于right时就完成单词逆序(left<right中间没有可交换元素循环终止).

void reverse_arr(char* left, char* right)
{
	assert(left && right);
	while (left < right)
	{
		char t = *left;
		*left = *right;
		*right = t;
		left++;
		right--;
	}
}

主函数逆序每个单词思路:
准备cur:
首先使用我们需要把首地址交给一个指针变量(char* cur=arr).
①因为我们需要保留首地址的位置,②在最后移动整个字符串时需要用到.③可以用这个指针变量指向的值判断单词逆序循环是否结束.

char* cur = arr;

单词逆序:
ⅰ:定义两个指针(star,end)找到每个单词的首尾,开始都指向单词开头,让end指针判断如果不是空格就移动,遇到空格跳出,此时end指针指向空格,end-1指向单词末尾,将此时单词首尾地址star,end传入准备好的逆序函数完成逆序.**

ⅱ:每个单词结束标志可能空格或者\0,所以需要分情况讨论.
①如果*end是空格跳出,需要把空格下一个字符地址给cur (cur=end+1),循环条件(cur)就可以判断是否为字母,如果是字母就循环,把此时的字符地址当作下一个单词的首地址(char * star=cur),end指针再次指向单词开始部位,重复指行ⅰ
②如果
end是\0跳出 (字符串每个单词逆序结束),需要把此时地址给end(cur=end),循环条件(*cur)就判断为假,循环结束.

单词逆序代码:

while (*cur)
	{
		//逆序每个单词
		//先找到每个单词首尾
		//每个单词结束后可能是空格或者\0
		char* star = cur;
		char* end = cur;
		while (*end != ' '&&*end!='\0')
		{
			end++;
		}
		//把每个单词首地址和尾地址传给逆序函数,
		//end出来指向是空格或者\0再-1才是尾地址
		reverse_arr(star, end - 1);
		//如果出来的是\0再返回end+1就越界了
		if (*end != '\0')
		{
			cur = end + 1;
		}
		else
		{
			cur = end;
		}
	}

逆序整个字符串:
求出整个字符串长度len,用到库函数strlen(arr),
再次调用逆序函数传入参数arr,len

逆序字符串代码:

	int len = strlen(arr) - 1;
	reverse_arr(arr,  arr+len);
	printf("%s\n", arr); 

2.字符串逆序总代码

#include<stdio.h>
#include<string.h>
#include<assert.h>
void reverse_arr(char* left, char* right)
{
	assert(left && right);
	while (left < right)
	{
		char t = *left;
		*left = *right;
		*right = t;
		left++;
		right--;
	}
}
//I like beijing.
int main()
{
	char arr[101];
	gets(arr);
	char* cur = arr;
	while (*cur)
	{
		//逆序每个单词
		//先找到每个单词首尾
		//每个单词结束后可能是空格或者\0
		char* star = cur;
		char* end = cur;
		while (*end != ' '&&*end!='\0')
		{
			end++;
		}
		//把每个单词首地址和尾地址传给逆序函数,end出来指向是空格或者\0再-1才是尾地址
		reverse_arr(star, end - 1);
		//如果出来的是\0再返回end+1就越界了
		if (*end != '\0')
		{
			cur = end + 1;
		}
		else
		{
			cur = end;
		}
	}
	//逆序整个字符串
	int len = strlen(arr) - 1;
	reverse_arr(arr,  arr+len);
	printf("%s\n", arr); 
	return 0;
}


总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了字符串逆序,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值