【每日一题】 将一句话单词倒置,标点不倒置

用C语言将一句话的单词倒置,标点不倒置。

比如输入: i like shanghai.

输出得到: shanghai. like i

这道题目有很多种做法,既可以用递归,也可以分成两部分函数来写,本文就详细来讲解分装为两个函数的做法。

思路:我们可以轻易实现一个字符串的倒置,可以先将整个字符串来倒置,然后再设置函数来倒序每一个单词,用空格作为区分每个单词的标志,这样下来就可以实现将一句话单词倒置,标点不倒置。

主函数如下所示。

int main()
{
	char s[100] = { 0 };
	gets_s(s);
	int start=0, end=strlen(s);
	reverse(start, end, s);
	reverse_word(start, end, s);
	printf("%s", s);
	return 0;
}

1.reverse函数的构建

首先构建reverse函数来实现整个字符串的逆转,只需创建一个中间变量即可。

void reverse(int start, int end, char s[])
{
	end--;
	while (start < end)
	{
		char tmp = s[start];
		s[start] = s[end];
		s[end] = tmp;
		start++;
		end--;
	}
}

需要注意的是,为了保证下标不在标点的位置,即为了不交换符号,end一定要-1。

如果不想再函数内部减一的话,可以在进行函数传参的时候减一。 

2.reverse_word函数的创建

接下来创建将每一个单词逆转的函数,我们使用两个while循环

外层循环的循环条件为while (s[end] != '\0'),当end的位置走到'\0'的位置时,循环结束。

内部的while循环是将end移位到一个单词的末尾,也就是空格的位置,与在开头的start共同将一个单词锁定,接着就可以再次调用上面的reverse函数实现单词的逆序。

要注意的是,单词的末尾可能是'\0',为了防止s[end]取到零值而导致函数提前结束,我们将不等于零值也变为循环的条件。

将一个单词逆序之后,我们将目标转换为下一个单词,先将end的值赋给start,再让end移位到下一个空格处,锁定第二个单词

void reverse_word(int start, int end, char s[])
{
	start = 0, end = 0;
	while (s[end] != '\0')
	{
		while (s[end] != ' '&&s[end]!='\0')
		{
			end+=1;
		}
		reverse(start, end, s);
		start = end+1;
		if(s[end]!='\0')
		end += 1;
	}
}

 完整代码:

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

void reverse(int start, int end, char s[])
{
	end--;
	while (start < end)
	{
		char tmp = s[start];
		s[start] = s[end];
		s[end] = tmp;
		start++;
		end--;
	}
}
void reverse_word(int start, int end, char s[])
{
	start = 0, end = 0;
	while (s[end] != '\0')
	{
		while (s[end] != ' '&&s[end]!='\0')
		{
			end+=1;
		}
		reverse(start, end, s);
		start = end+1;
		if(s[end]!='\0')
		end += 1;
	}
}
int main()
{
	char s[100] = { 0 };
	gets_s(s);
	int start=0, end=strlen(s);
	reverse(start, end, s);
	reverse_word(start, end, s);
	printf("%s", s);
	return 0;
}

文章如果有问题的话,还请大佬们不吝赐教!

如果您觉得我写的不错,不妨点个赞支持一下哦~

猜你喜欢

转载自blog.csdn.net/weixin_73534885/article/details/129092782