【C语言】实现将一句话的单词进行逆序(图文辅助理解)

 如图,本题要求将一句话中的单词进行倒叙

i like beijing.

可以考虑将其分成两步

第一步:先将每个单词倒置

   即:

   i ekil .gnijieb

第二步:将整个字符串倒置

    即:

beijing. like i

也可以先将整个字符串倒置,再将每个单词倒置;

但这两种方法,都需要一个函数来实现倒置的功能

 那在这里,我们考虑实现一下这个能实现倒置的函数

对于 beijing. 这个单词来说,一共有八个字符,

 如图,单词开头和结尾各有两个箭头,他们指向单词的第一个字母和最后一个字母,只需要将他们交换一下位置,再让左边的箭头向右走一下,让右边的箭头向左走一下,重复这个操作即可,而这两个箭头,其实就是指针的概念。

//实现交换函数

void reverse(char* left,char* right)
{
     while(left < right)
     {
      
         
          char tem = *left; 
          *left = *right;
          *right = tem;
          left++;
          right++;    

     }



}

到现在,reverse这个能实现倒置功能的函数我们就实现了,但现在新的问题就是:我们应该如何确定这两个箭头呢

题目中要求我们先输入字符串,再对其逆置,这里由于i like beijing.这句话里有空格,所以我们选择gets来输入

即:

char arr[101] = { 0 };

gets(arr);

这样,我们就能够在运行代码时输入你想要逆序的字符串了

首先,让我们记录一下第一个字母的箭头,也就是i like beijing.这个字符串的首元素地址

char* cur = arr;

按照我们的逻辑,我们希望在字符串结束之前(遇到\0),能把字符串中的每个单词都倒置

因此,我们使用while循环

while(*cur)//只要没遇到\0,都会执行单词逆序这个过程

在while循环里,我们定义之前提到的两个箭头

                      char* start = cur;

                      char* end = cur;

                       如果*end指向的内容不是空格,也不是\0,那就让end箭头继续向后走一位,直到遇到空格为止

           while(*end != ' ' && != '\0')

           {

                end++;

           }

 不管是空格还是\0让while停下来,箭头-1就是这个单词最后一个字母

这样 一个单词的起始位置和结束位置的两个箭头,我们就都获得了

调用之前写的reverse函数:reverse(strat,end-1);

此时右边箭头指向空格,我们只需要对end+1就可以让他跳转到下一个字母的起始位置了

进行到这里,一切看起来都很合理,但这里出现了一个问题:那如果是最后一个单词呢?

我们如果让指向 \0 的箭头再往右走,那可想而知结局一定很悲惨

因此我们要再进行一步判断

if(*end != '\0')

    cur = end +1;

else

    cur = end;

while循环到这里结束

至此,我们便实现了将每个单词逆序

同样的办法,我们再把整个字符串逆序。

int len = strlen(arr);

reverse(arr,arr+len-1);

printf("%s\n",arr);

这样,我们就实现了将一句话逆序的功能。接下来将贴出整个代码

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

void reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
	    * left = *right;
		*right = tmp;
		left++;
		right--;
	}

}


int main()
{
	char arr[101] = { 0 };
	gets(arr);
	//处理
	char* cur = arr;
	//逆序每个单词
	while (*cur)
	{
		char* start = cur;
		char* end = cur;
		while (*end != ' '&& *end != '\0')
		{

			end++;//当循环停止时,*end就是' '了
		}
		reverse(start, end - 1);
		if (*end != '\0')
	       cur = end + 1;
		else
		   cur = end;
		
		

	}
	//逆序整个字符串
	int len = strlen(arr);
	reverse(arr, arr + len - 1);
	printf("%s\n", arr);


	return 0;
}

欢迎大家指出文章中的不足和纰漏,大家一起学习,成长,感谢大家耐心读完!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝色学者i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值