2022.3.16 关于倒置字符串(阶段测试题)

本文介绍了如何使用C语言实现字符串整体及单词的倒置。首先通过strlen函数确定字符串长度,然后利用指针交换首尾字符实现字符串倒置。接着,通过寻找单词边界(以空格为界)并调用倒置函数,实现单词内部的字母倒置。最终,程序能够将如'Ilikebeijing.'这样的句子倒置为'beijing.likeI'。
摘要由CSDN通过智能技术生成

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

总体思路:

第一步:我们可以先将 I like beijing. 这句话进行完全倒置,将其变为 .gnijieb ekil I

第二步:我们可以再将组成该字符串的各单词以空格为区分进行倒置,进而达成目的 


倒置字符串函数

在一个字符串中,我们可以先利用strlen函数计算出其字符串的总长,进而我们可以创建一个指针left 存储其首字符地址和指针right 存储字符串最后一个字符的地址,引入第三个变量tmp,使其两字符相互调换,随后指针 left +1,指针right-1,便可将第二个字符和倒数第二个字符进行交换,直至left>=right为止!

代码如下:

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

void reverse(char* l, char* r)
{
    assert(l && r); //断言,保证指针变量l和r的有效性
	while (l < r)
	{
		char tmp = *l;
		*l = *r;
		*r = tmp;
		l++;
		r--;
	}
}

int main()
{
	char arr[100] = {0};
	gets(arr); // 输入字符串内容 
	int len = strlen(arr);
	char* left = arr; //字符串首字符地址
	char* right = arr+len - 1; //字符串最后一个字符地址
	reverse(left,right); //字符串倒置函数
	printf("%s\n", arr);
	return 0;
}

测试结果如下:


利用字符串倒置函数实现题目要求

利用该函数已经实现了我们第一步的字符串倒置,那如何再次利用该函数实现我们的单词倒置呢?

单词之间以空格为区分。

我们先将字符串首元素地址赋值给两个指针变量,一个存储单词首字母地址,另一个以该单词首字母为起点不断++,直到其指针变量指向空格为止,从而这两个指针变量之间夹着的就是一个单词首末字母的地址,再将这两个指针变量传给字符串倒置函数,从而实现单个字母的倒置。

当我们想倒置第二个单词时,将存储空格的指针变量+1赋给存储前单词首字母地址的指针变量,最后将存储空格的指针变量++,从而开始重复第一个单词倒置的步骤,直到存储空格的指针变量不为 ' \0 ' 即结束。

注意:最后一个单词不是以空格结束,而是以'\0'作为结束标识!

代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
//将一句话的单词进行倒置,标点不倒置。比如 I like beijing.经过函数后变为:beijing.like I

void reverse(char* l, char* r)
{
	assert(l && r); //断言,保证指针变量l和r的有效性
	while (l < r)
	{
		char tmp = *l;
		*l = *r;
		*r = tmp;
		l++;
		r--;
	}
}

int main()
{
	//倒置整个句子
	char arr[100] = {0};
	gets(arr); // 输入字符串内容 
	int len = strlen(arr);
	char* left = arr; //字符串首字符地址
	char* right = arr+len - 1; //字符串最后一个字符地址
	reverse(left,right); //字符串倒置函数
	//倒置单词
	char* tme = arr;  // 存储第一个字母首字母地址
	char* start = arr; // 存储第一个字母首字母地址后用来寻找空格的指针变量
	while (*start!='\0')  // 以空格为界寻找单词的循环体 
	{
		while (*start !=' ' && *start!='\0') //指针变量start寻找空格的循环体 注意:最后一个单词不是以空格结束,而是以'\0'作为结束标识
		{
			start++;
		}
		reverse(tme, start - 1); //运用函数倒置单词
		tme = start + 1; 
		if (*start != '\0') //注意:最后一个单词结束的标识符是'\0',此时的指针变量不需要++了。
			start++;
	}
	printf("%s\n", arr);
	return 0;
}

运行结果如下: 


谢谢浏览,博主写文章不易,可以留下您的点赞,或收藏激励博主!

若文章有错误,请各大佬多多指出,我会及时更正! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

茂大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值