倒置字符串不会?看这篇!

请看题目:

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:

每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100

输出描述:

 依次输出倒置之后的字符串,以空格分割

 大体思路:

先整体倒置,再倒置单词;

两次倒置的逻辑是相同的;

只是起始(下标)不同。

解题:

由于两次倒置的逻辑相同,这里先写一个倒置函数:

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

整体倒置:

给reverse函数传参,这两个参数还是比较好传的

第一个是arr(数组首元素的地址);

另一个是arr+strlen(arr)-1  (数组末尾元素的地址);

单词倒置:

 这一部分需要注意的是如何寻找一个单词的首尾

如图所示,我们可以拟两个变量,一个在开头守着,另一个负责寻找结束标识

这样就相当于把一个单词选定了,把位置传入reverse函数就可以了。

接下来重复上述操作,直到遇到'\0'为止。

char* cur = arr;
	while (*cur)//当*cur为\0时结束,可作为循环判定标志
	{
		char* start = cur;
		while (*cur != ' '&&*cur!='\0')
		{
			cur++;
		}
		reverse(start, cur-1);
		if(*cur!='\0')//避免跳过\0 导致死循环
			cur++;
	}

 最终答案:

#include<stdio.h>
#include<string.h>//包含strlen()

//字符串倒置
void reverse(char*left,char*right)
{
	while (left<right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}

int main()
{
	//输入
	char arr[100] = { 0 };
	gets(arr);//防止遇到空格停止读取
	//整体倒置
	reverse(arr,arr+strlen(arr) - 1);
	//单词倒置
	char* cur = arr;
	while (*cur)
	{
		char* start = cur;
		while (*cur != ' '&&*cur!='\0')
		{
			cur++;
		}
		reverse(start, cur-1);
		if(*cur!='\0')
			cur++;
	}
	//输出
	printf("%s\n", arr);
	return 0;
}

如果你觉得这篇文章还不错并且对你有帮助的话,欢迎三连!!!

猜你喜欢

转载自blog.csdn.net/Claffic/article/details/128259435