【C语言题解】将一句话的单词进行倒置,标点不倒置。

题目描述:将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。

原题目

题目描述:

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

输入描述:

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

输出描述:

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

题目链接:

https://www.nowcoder.com/questionTerminal/8869d99cf1264e60a6d9eff4295e5bab

整体思路

先将整句话逆序处理,然后再将每个单词进行逆序,这样一来整句话的顺序虽然颠倒了,但是单词因为逆序了两次,还是正常顺序。

分步实现

1. 输入字符串

利用gets函数输入获取整句话的字符串。

#include <stdio.h>
int main()
{
    
    
	char arr[100];
	gets(arr);//和scanf函数类似,获取键盘输入的字符
	printf("%s", arr);//测试是否获取到了
	return 0;
}

编译结果:
image.png

2. 逆序功能

自定义写一个reverse函数,利用指针来逆序字符串的内容,之所以写成函数是因为这个功能需要复用。
利用数组在栈区中存放时,下标由小到大,地址由低到高存放的原理,判断其首元素地址和末位元素的地址,如果左边的地址小于右边,使用指针进行元素交换,并且左边指针++,右边指针–,重新进行循环判断,直到左边大于等于右边,则跳出循环,这样就可以完成字符串的逆序操作。

#include<string.h>
void reverse(char* left, char* right)
{
    
    
	char tmp;
	while (left < right)
	{
    
    
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

3. 整句话逆序

利用strlen函数,求得字符串长度,就可以利用reverse函数将首元素地址,和首元素地址加字符串长度减一,将整句话逆序。

#include <stdio.h>
int main()
{
    
    
	char arr[100];
	gets(arr);
	int len = strlen(arr);
	reverse(arr, arr + len - 1);//传入首元素地址和末位元素地址
	printf("%s\n", arr);//测试用
	return 0;
}

编译结果:
image.png

4. 单词逆序

利用指针来判断是否遇到了空格或者\0,没有遇到的话,指针向前走,如果遇到了,就将之前的内容逆序一次,直到指针走到\0,跳出循环。

int main()
{
    
    
	char arr[100];
	gets(arr);
	int len = strlen(arr);
	reverse(arr, arr + len - 1);
	char* cur = arr;//cur作为光标遍历整个字符串并进行判断
	char* start = arr;//start作为每个单词的第一个元素地址指针用
	while (*cur)
	{
    
    
		while (*cur != ' ' && *cur != '\0')
		{
    
    
			cur++;//不是空格或者\0,指针就向前走
		}
		reverse(start, cur - 1);//将这个单词的开头和末位地址传入reverse进行逆序
		start = cur + 1;//start去指向新单词的开头
		if (*cur != '\0')//直到*cur(数组元素)等于\0时,cur(指针)停止++,并且在while循环处跳出循环(因为\0就是0,为假)
		{
    
    
			cur++;
		}
	}
	printf("%s\n", arr);//打印字符串
	return 0;
}

编译结果:
image.png

5. 整体代码和oj结果

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

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

int main()
{
    
    
	char arr[100];
	gets(arr);
	int len = strlen(arr);
	reverse(arr, arr + len - 1);
	char* cur = arr;
	char* start = arr;
	while (*cur)
	{
    
    
		while (*cur != ' ' && *cur != '\0')
		{
    
    
			cur++;
		}
		reverse(start, cur - 1);
		start = cur + 1;
		if (*cur != '\0')
		{
    
    
			cur++;
		}
	}
	printf("%s\n", arr);
	return 0;
}

image.png

写在最后

如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。

博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。

谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!

猜你喜欢

转载自blog.csdn.net/weixin_70218204/article/details/132161723