C语言经典题目之字符串逆序

news2024/12/23 0:54:08

目录

一、字符串逆序(基础题)

1.一个经典的错误,标准的零分

2.采用gets函数来修补漏洞

​编辑

3.非要使用scanf怎么办?

 4.使用指针来实现逆序函数

5.将函数修改为,只要传入两个地址,就能逆序这两个地址之间的字符串。

二、字符串逆序(进阶)


一、字符串逆序(基础题)

链接:字符逆序__牛客网
来源:牛客网

这道题的要求是让我们实现一个字符串逆序

1.一个经典的错误,标准的零分

这道题其实,思路上不难,但是有一个点处很容易犯错,我们看下面这个代码

#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	int left = 0;
	int right = strlen(str) - 1;
	while (left < right)
	{
		char tmp = 0;
		tmp = *(str + left);
		*(str + left) = *(str + right);
		*(str + right) = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[10000] = { 0 };
	scanf("%s", arr);
	reverse(arr);
	printf("%s", arr);
	return 0;
}

看似正确,但实际上存在一个问题,我们现在牛客网上跑一下

 果然如我们所料,出现意外了,那么问题出在哪里了呢?其实,问题是出在scanf上了,scanf默认读取到空格就结束了,因此这道题其实只读取了一个d,反转之后当然是d了

2.采用gets函数来修补漏洞

既然scanf不能用,那么该如何解决呢?,其实我们c语言中还有一个函数叫做gets()函数,他也可以读取一个字符串,他不会读取到空格就结束了

代码如下

#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	int left = 0;
	int right = strlen(str) - 1;
	while (left < right)
	{
		char tmp = 0;
		tmp = *(str + left);
		*(str + left) = *(str + right);
		*(str + right) = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[10000] = { 0 };
	gets(arr);
	reverse(arr);
	printf("%s", arr);
	return 0;
}

牛客网运行结果为

3.非要使用scanf怎么办?

有些时候,非要使用scanf解决这个问题,那么我们如何实现呢?,其实我们可以将%s修改为%[^\n],意思是,读取到\n才结束读取

代码如下

#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	int left = 0;
	int right = strlen(str) - 1;
	while (left < right)
	{
		char tmp = 0;
		tmp = *(str + left);
		*(str + left) = *(str + right);
		*(str + right) = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[10000] = { 0 };
	//gets(arr);
	scanf("%[^\n]", arr);
	reverse(arr);
	printf("%s", arr);
	return 0;
}

牛客网运行结果为

 4.使用指针来实现逆序函数

上面的实现方式,其实本质上仍然属于数组的形式,那么我们能不能改为指针呢?答案是可以的,请看下面的代码

#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	char* left = str;
	char* right = str + strlen(str) - 1;
	while (left < right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[10000] = { 0 };
	//gets(arr);
	scanf("%[^\n]", arr);
	reverse(arr);
	printf("%s", arr);
	return 0;
}

牛客网运行结果为

 

5.将函数修改为,只要传入两个地址,就能逆序这两个地址之间的字符串。

经历了上面的思考,我们在想,这个逆序多多少少还是有一点不方便,比如在某一个字符串中,我们不想逆序整个字符串,我们只想要逆序一部分,这时候我们上面的函数适用性就不够了,所以我们最好将其改成只要传入两个地址,就可以逆序这两个地址之间的字符串,这样的话,这个函数就变得很好用了。

代码如下

#include<stdio.h>
#include<string.h>
void reverse(char* left,char* right)
{
	while (left < right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[10000] = { 0 };
	//gets(arr);
	scanf("%[^\n]", arr);
	reverse(arr, arr + strlen(arr) - 1);
	printf("%s", arr);
	return 0;
}

牛客网运行结果为

二、字符串逆序(进阶)

有了上面那到题目作为基础,我们可以尝试做一下这道题

链接:倒置字符串_牛客题霸_牛客网

来源:牛客网

这道题我们可以看的出来,是上一道题的进阶版,但是根据我们上一道题的思考之后,这道题其实也没有那么难,因为我们已经创建一个函数,只要传入两个地址,就可以逆序这两个地址之间的字符串。

所以我们的思路就是,先逆序,整个字符串,然后逆序每一个单词

代码如下

#include<stdio.h>
#include<string.h>
void reverse(char* left,char* right)
{
	while (left < right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[100] = { 0 };
	gets(arr);
	//逆序整句话
	reverse(arr, arr + strlen(arr) - 1);
	//逆序每一个单词
	char* p1 = arr;
	char* p2 = arr;
	while (*p2 != '\0')
	{
		p1 = p2;
		while (*p2 != ' '&&*p2!='\0')
		{
			p2++;
		}
		reverse(p1, p2 - 1);
		if (*p2 == '\0')
		{
			break;
		}
		p2++;
	}
	printf("%s", arr);
	return 0;
}

对于这段代码的逆序每一个单词环节,可能有很多人都有所困惑。为什么是这样实现的呢?

我们逆序单词是采用的双指针的方法。先定义两个字符指针他们指向字符串的首元素地址,然后我们令p1先不动,p2往下走,只要我的p2不是'\0',自然就可以一直走下去,在里面我们先采用一个while循环,来让p2 走到单词的末尾,然后使用逆序函数,逆序这两者之间的单词,然后判断一下p2的里面的值是否为\0,如果此时为\0就不需要进行接下来的步骤了,直接结束即可。

但是如果此时不为'\0',那么就要继续执行下去,先让p2++,让我们的p2指向下一个单词的首元素,将下一个单词的首元素交给p1,然后p2继续走下去,这样循环下去就可以实现目标了。

 牛客网运行结果为

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新 | VDA-ISA5.0.4最新版本发布,汽车企业如何增强信息安全?

汽车行业拥有广泛而复杂的供应链&#xff0c;包括汽车整车制造商、不同层级的零部件厂商、供应商、服务商等众多企业。在这个链条上&#xff0c;其中任何一家企业的网络安全问题不论是数据泄密还是内外部攻击都有可能对整个供应链造成巨大影响。 比如2021年6月&#xff0c;某德…

Apifox很难不爱

一、背景 项目开发我们都知道在一个项目团队中是由很多角色组成&#xff0c;最常见团队的就是前端开发工程师、客户端开发工程师、服务端开发工程师组成一个团队&#xff0c;团队之间进行合作&#xff0c;一般我们都离不开API接口管理和测试&#xff0c;API接口管理可以理解为前…

推荐,文本转图像,图像转图像运营再也不用担心配图了

由 CompVis 领导的 Stable Diffusion V1 改变了开源人工智能模型的性质&#xff0c;并在全球范围内催生了数百个其他模型和创新。Stable Diffusion 如今也是所有软件中最快攀升至 Github 10K Stars 的软件之一&#xff0c;在不到两个月的时间里&#xff0c;它的 Stars 飙升至 3…

【内网安全】——windows信息收集

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

Nginx安装

目录 1. 安装必要环境 1.1 需要安装gcc环境 1.2 PERE 1.3 zlib 1.4 openssl 2. 安装nginx 2.1 下载和解压 2.2 编译 2.2.1 设定配置 2.2.2 编译 2.2.3 安装 3. 启动nginx 4. 配置环境变量 5. 加入system管理 1. 下载Nginx 1. 安装必要环境 1.1 需要安装gcc环境 y…

基于PHP+MySQL学院信息发布系统的设计与实现

再添加完最新动态后可以点击最新动态管理,对已经添加过的最新动态进行编辑和删除,绑定的主要信息包括用文章标题,发布人,发布时间,文章类型,内容等信息 信息技术学院信息发布系统,是一个为学校提供信息的平台,是完全的,高速的,开放的,其核心思想是提供一个以自然语言为主的用户…

算法竞赛入门【码蹄集进阶塔335题】(MT2276-2280)

算法竞赛入门【码蹄集进阶塔335题】(MT2276-2280&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2276-2280&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2276 数的自我2. MT2277 分数个数3. MT2278 欧拉函数…

[附源码]Python计算机毕业设计Django房屋租赁系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Web3 来了,让我们展开双手拥抱它吧!

Web3的由来 在介绍Web3概念&#xff0c;有必要阐述下当下的网络世界。而如今的互联网正处于Web2阶段&#xff0c;其已经帮助数以亿计的人融入这个互联网大家庭&#xff0c;可在网络上构建可靠、稳定的基础设施。然而也正是Web2中心化网络成就了极少数互联网巨头&#xff0c;他…

基于STM32的智能家居控制系统设计与实现(带红外遥控控制空调)

1. 前言 智能家居作为家庭信息化的实现方式,已经成为社会信息化发展的重要组成部分,物联网因其巨大的应用前景,将是智能家居产业发展过程中一个比较现实的突破口,对智能家居的产业发展具有重大意义。 本文基于现有智能家居技术设计和实现情况,本着方便操作、增强功能、贴…

Xilinx的TestPattern模块编译错误解决方法

在使用vivado 2018.3编译tpg模块的时候报错&#xff0c;软件提示找不到编译模块&#xff0c;如下&#xff1a; 经过多方咨询后&#xff0c;据说是vivado的版本问题引起的&#xff0c;使用这个版本在2022年之前不会出现问题&#xff0c;因此如果把windows的系统时间修改到2021年…

(论文阅读笔记)Network planning with deep reinforcement learning

[1] ZHU, Hang, et al. Network planning with deep reinforcement learning. In: Proceedings of the 2021 ACM SIGCOMM 2021 Conference. 2021. p. 258-271. Citation: 25文章目录Q1 论文试图解决什么问题&#xff1f;Q2 这是否是一个新的问题&#xff1f;Q4 有哪些相关研究&…

基于GeoPandas的POI人口数赋值方法,按面提取点数据并赋值

基于GeoPandas的POI人口数赋值方法 这个方法是某篇文章中提到的&#xff0c;基于未知兴趣点和街道中心人口点进行的未知兴趣点人口赋值。 我们先来说一下数据&#xff0c;street是街道面数据&#xff0c;里面有一个population字段&#xff0c;用来记录街道总人口值。有一个字…

炫技:拼接列表、破碎二维数组——Python sum()函数隐藏技能花式玩法

【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 自学并不是什么神秘的东西&#xff0c;一个人一辈子自学的时间总是比在学校学习的时间长&a…

【k8s金牌知识】k8s升级攻略

学习内容&#xff1a; 提示&#xff1a;不同版本升级略有差异&#xff0c;详见官网&#xff0c;本例是以Ubuntu为例 官方网址&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/ 1、 k8s升级注意事项 &#xff08;1&#xf…

阿里云产品有哪些?阿里云产品种类整理汇总

阿里云是全球领先的云计算及人工智能科技公司&#xff0c;提供云服务器、云数据库、云安全、云存储、企业应用及行业解决方案服务。那么阿里云产品有哪些?本文为大家介绍下阿里云产品方案及阿里云有哪些热门云产品?阿里云主要产品及功能介绍&#xff0c;阿里云产品分为6大分类…

Flink同步Kafka数据到ClickHouse分布式表

公众号文章都在个人博客网站&#xff1a;https://www.ikeguang.com/ 同步&#xff0c;欢迎访问。业务需要一种OLAP引擎&#xff0c;可以做到实时写入存储和查询计算功能&#xff0c;提供高效、稳健的实时数据服务&#xff0c;最终决定ClickHouse什么是ClickHouse&#xff1f;Cl…

[附源码]JAVA毕业设计高校疫情管理(系统+LW)

[附源码]JAVA毕业设计高校疫情管理&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

[附源码]计算机毕业设计springboot社区疫情防控信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Android OpenGL ES 学习(五) -- 渐变色

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投屏 Android OpenGL ES 学习(五) – 渐变色 代码工程地址&#xff1a; https://…