将一句话的单词进行倒置,标点不倒置(详细题解)

今天阿博给大家给csdn的友友们分享一下双重逆序的做题感悟和分析😊😊😊

一.将一句话的单词进行倒置,标点不倒置。比如输入 I LIke Beijing.经过函数变为Beijing. Like I

当我们看到提后,我们首先就会想到逆序字符串,但是这一题比较特殊,当我们逆序完字符串之后,它的效果就会变为.gnijieB ekiL I,这不是我们想要的,所以这时候我们就需要对每个单词也做出逆序的处理,这就是今天的双重逆序😎😎😎.

二.代码实现

这里我们首先需要输入一个数组

#include<stdio.h>
int  main()
{
	char arr[101] = { 0 };
	scanf("%s", arr); 
	printf("%s\n", arr);
	return  0;
}

在这里插入图片描述
兄弟们注意了,这里我们就不能再用scanf了,因为如果用scanf的话,当输入的字符之间有空格的时候,只能打印空格之前的字符.这里给兄弟们介绍一个小法宝🌹🌹🌹
在这里插入图片描述
而gets的功能刚好就是输入字符串,当我们这里用gets的话,就不会出现上述情况了
在这里插入图片描述
好了,接下来我们该逆序整个字符串,这里我们直接上代码.

void  reverse(char* left, char* right)            /*这里我们形参用指针接收首元素和末尾元素的地址*/
{
	assert(left && right);
	while (left < right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
int  len = strlen(arr);
	reverse(arr, arr + len - 1);

我们可以自定义一个reverse函数,这里arr就是字符串首元素的地址,arr+len-1就是末尾元素的地址,这里可能会有些友友不是很清楚,指针加整数n就是跳过n个指针类型大小!!!

接下来我们该逆序每个单词了,代码走起.

char* cur = arr;                     /*接下来我们该逆序单词了*/
	while (*cur)
	{
		char* start = cur;
		while (*cur != ' ' && *cur != '\0')     /*这里我们必须加上\0,因为如果当字符串后面没有字符时,它的结尾是\0,而此时我们不需要cur++了*/
		{
			cur++;
		}
		reverse(start, cur - 1);
		if(*cur==' ')                     /*这里也要加上限制条件,如果字符串都逆序过了,在进行加加就有可能陷入死循环*/
		cur++;
	}

这里我们用两个while循环,第一个while循环的意思是当*cur为‘\0’的时候,‘\0’的ascll值为0,所以每个单词都完成了逆序,循环将不再进行.第二个while循环的意思是当cur不等于空格或不等于‘\0’的时候,我们让cur++,以此来完成每个单词的逆序,这里我们需要注意了,第二个while循环中逻辑与的第二部分我们很可能不加,如果没有不等于\0这个条件,当逆序完最后一个单词的时候,cur++,这时候程序很可能就进入死循环.
同理如果我们第二个if语句没加的话,当逆序完最后一个单词的时候,cur++,这时候程序也很可能就进入死循环.
当我们写完代码的时候,要对指针进行断言,assert(left&&right),断言left和riight不是空指针,增强我们代码的强壮性.🥰🥰🥰
接下来是代码的全部实现

#include<stdio.h>
#include<assert.h>
void  reverse(char* left, char* right)            /*这里我们形参用指针接收首元素和末尾元素的地址*/
{
	assert(left && right);
	while (left < right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
int  main()
{
	char arr[101] = { 0 };
	gets(arr);          /*  这里不能用scanf,因为当有空格的时候,scanf跳不过去*/
	int  len = strlen(arr);
	reverse(arr, arr + len - 1);      /*这里我们逆序整个字符串*//*,*//*arr传入的是首元素的地址,arr+len-1传入的是末尾元素的地址*/
	char* cur = arr;                     /*接下来我们该逆序单词了*/
	while (*cur)
	{
		char* start = cur;
		while (*cur != ' ' && *cur != '\0')     /*这里我们必须加上\0,因为如果当字符串后面没有字符时,它的结尾是\0,而此时我们不需要cur++了*/
		{
			cur++;
		}
		reverse(start, cur - 1);
		if(*cur==' ')                     /*这里也要加上限制条件,如果字符串都逆序过了,在进行加加就有可能陷入死循环*/
		cur++;
	}
	printf("%s\n", arr);
	return  0;
}

好了,兄弟们,以上就是阿博所有的总结了,如果感觉有帮助的话,可以给阿博点个关注哦,我们一起学习编程,下期再见💞.

在这里插入图片描述

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿博历练记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值