倒置字符串(C语言)

题目描述

将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。字符串长度不超过100。

输入描述

输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。‘.’ 只出现在最后一个单词的末尾。

输出描述

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

示例

输入

I like beijing.

输出

beijing. like I

1、解题思想

I like beijing.

对于这个字符串单词的逆置可以有两种思路:

  1. 先逆序整个字符串
.gnijieb ekil I
  1. 再逆序每个单词
beijing. like I

第二种

  1. 先逆序每个单词
I ekil .gnijieb
  1. 再逆序整个字符串
beijing. like I

2、具体实现

无论按照哪个思路来进行解题我们都需要进行多次字符串的逆序,所以我们可以写一个函数来完成这一功能:

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

完成逆序函数后就可以完成主函数的书写了

int main()
{
	char arr[101] ;
	gets(arr);//gets可以读取中间有空格的字符串
	int len = strlen(arr);
	reverse(arr, arr + len - 1);//将字符串整体逆序
	char* start = arr;
	char* cur = arr;
	while (*cur)//cur指针到'\0'退出循环
	{
		//先找到一个单词的后一位
		while (*cur != ' '&&*cur!='\0')
		{
			cur++;
		}
		reverse(start, cur - 1);//将每个单词进行逆序
		start = cur + 1;//让头指针指向下一个单词的第一个
		if (*cur == ' ')//当到了整个字符串的最后一位
		//cur指向'\0'后不再后移,否则循环判断条件就会失效
		{
			cur++;
		}
	}
	printf("%s", arr);
	return 0;
}

3、整体代码及运行测试

#include 
#include 
void reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[101] ;
	gets(arr);
	int len = strlen(arr);
	reverse(arr, arr + len - 1);
	char* start = arr;
	char* cur = arr;
	while (*cur)
	{
		while (*cur != ' '&&*cur!='\0')
		{
			cur++;
		}
		reverse(start, cur - 1);
		start = cur + 1;
		if (*cur == ' ')
		{
			cur++;
		}
	}
	printf("%s", arr);
	return 0;
}

在这里插入图片描述

做题小技巧
1、scanf函数输入时遇到空格或换行就会停止,可以使用gets进行输入
2、使用指针移动时要注意每个时刻指针指向的位置避免发生错误

你可能感兴趣的:(C语言,c语言,开发语言,学习)