几个字符串函数的使用和模拟实现(1)

news2024/12/24 0:23:10

下面介绍几个常见的字符串函数的使用并且学会自己创建实现与它们一样的功能,借此来巩固与字符串、函数、指针相关方面的知识。

strlen函数(头文件是<string.h>)

由此可见:

·strlen函数的返回值是返回值是size_t,是无符号的(在使用函数返回值进行加减运算判断两个字符串长度时容易发生错误)

·函数的形参是指向char的指针,由于只用来计算而不改变字符串内容,因此使用const

·使用指针在访问字符串内容时,访问到'\0'就停止,因此计算的长度是\0以前,不包括\0

 strlen的使用方法举例:

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

int main()
{
	const char arr1[] = "abcdef";
	const char arr2[] = "abc";
	
	size_t len1 = strlen(arr1);
	size_t len2 = strlen(arr2);
	
	printf("arr1的长度为:%d\narr2的长度为:%d", len1, len2);
	
	return 0;
}

使用strlen函数判断两个字符串长度大小

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

int main()
{
	const char* arr1 = "ab";
	const char* arr2 = "abc";
	
	if(strlen(arr1) - strlen(arr2) > 0)
		printf("arr1的字符串长度大于arr2\n");
	else if(strlen(arr1) - strlen(arr2) < 0)
		printf("arr1的字符串长度小于arr2\n");
	else
		printf("相等");

	return 0;
}

显而易见,在程序中arr1的字符串长度要小于arr2的,但是我们来看下程序运行结果:

还记得我上面说的它的返回值是size_t,无符号整形,就算结果是时-1,他也会转化为1

但是我们可以对他的返回值进行强制类型转换,借此达到目的:

	if((int)strlen(arr1) - (int)strlen(arr2) > 0)
		printf("arr1的字符串长度大于arr2\n");
	else if((int)strlen(arr1) - (int)strlen(arr2) < 0)
		printf("arr1的字符串长度小于arr2\n");
	else 
		printf("相等");

strlen的几种不同模拟的实现方法

计数器方式
#include<stdio.h>
#include<string.h>

int my_strlen(const char* str)
{
	int count = 0;
	
	
	while(*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	const char* arr = "abcdef";
	
	int len = my_strlen(arr);
	printf("字符串的长度为%d", len);
	
	return 0;
}
不能创建临时变量的方式
#include<stdio.h>
#include<string.h>

int my_strlen(const char* str)
{
	if(*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	const char* arr = "abcdef";
	
	int len = my_strlen(arr);
	printf("字符串的长度为%d", len);
	
	return 0;
}

此处采用函数递归调用的方式,即先进行递推直到结束调用,后进行回归,计算每次递推调用的返回值,没学到也不要紧,简单理解一下

指针——指针的方式
#include<stdio.h>
#include<string.h>

int my_strlen(const char* str)
{
	const char *p = str;
	
	while(*str != '\0')
	{
		str++;
	}
	return str - p;
}
int main()
{
	const char* arr = "abcdef";
	
	int len = my_strlen(arr);
	printf("字符串的长度为%d", len);
	
	return 0;
}

这种方式是利用指针减去指针得到的是两指针间的元素个数

有一点需要注意,我们要把str的地址先传给另一个指针,因为再进行str++时,此时指针已指向字符串str的‘\0’处

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

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

相关文章

【回溯 状态压缩 深度优先】37. 解数独

本文涉及知识点 回溯 状态压缩 深度优先 LeetCode37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

突然连接不上 Bitbucket.org?

提交或拉取时都出现了错误 查找一下 Bitbucket.org 的IP&#xff0c;使用这个网址 https://site.ip138.com/bitbucket.org/ 找到C:\Windows\System32\drivers\etc下的hosts文件用记事本/notepad 打开&#xff0c;咱加到host文件里面 一切又恢复正常

UE5 C++软引用

一.软引用通常是仅储存资源对象的资源路径没有与资源产生耦合关系的引用&#xff08;软引用加载到内存中&#xff0c;只有在需要的时候才会被加载&#xff09; 软引用通常有FSoftObjectPath、FSoftClassPath、TSoftObjectPtr、TSoftClassPtr。它指向的资源未被加载&#xff0c…

四足机器人摆线规划程序

一、标准摆线公式 { x r ∗ ( θ − sin ⁡ ( θ ) ) y r ∗ ( 1 − cos ⁡ ( θ ) ) \left\{\begin{array}{l} xr *(\theta-\sin (\theta)) \\ yr *(1-\cos (\theta)) \end{array}\right. {xr∗(θ−sin(θ))yr∗(1−cos(θ))​ 这里的r表示摆线的圆的半径&#xff0c; θ \…

codeforces round944(div4)A~E题解

文章目录 [A. My First Sorting Problem](https://codeforces.com/contest/1971/problem/A)[B. Different String](https://codeforces.com/contest/1971/problem/B)[C. Clock and Strings](https://codeforces.com/contest/1971/problem/C)[D. Binary Cut](https://codeforces…

性能测试 --概念

什么是性能测试 性能测试和功能测试都是在系统测试阶段运行, 两者有什么区别呢? 案例:豌豆射手和三线射手都是射手, 它们的功能都是向前发射豌豆进行攻击, 能够攻击到地面的僵尸. 但是从性能上来讲, 豌豆射手只能攻击到一路的僵尸, 而三线射手能同时攻击三路(注:放在边路实际…

读天才与算法:人脑与AI的数学思维笔记24_预测性文本生成器

1. 起源 1.1. 人类讲故事可能起源于“假如……”这种问答结构 1.2. 讲故事是人类做安全试验的一种方式 1.2.1. 如果你问一个人“假如……”&#xff0c;其实是在探索你的行为对他可能带来的影响 1.3. 最早出现的故事极有可能就源自我们对在周遭混乱的环境中寻找某种秩序的渴…

基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)全网首发【图像识别-天气分类】

一个能够从给定的环境图像中自动识别并分类天气&#xff08;如晴天、多云、雨天、雪天闪电等&#xff09;的系统。 技术栈&#xff1a; 深度学习框架&#xff1a;PyTorch基础模型&#xff1a;VGG16与EfficientNet任务类型&#xff1a;计算机视觉中的图像分类 模型选择 VGG16 …

螺栓扭矩如何设计?——SunTorque智能扭矩系统

螺栓扭矩设计的大小是一个涉及工程实践的重要问题&#xff0c;它直接关系到螺栓连接的紧固质量和安全性。螺栓扭矩是工程领域中常用的一个概念&#xff0c;用来描述螺栓在连接过程中所需的旋转力矩。正确的螺栓扭矩可以确保螺栓和螺母之间的紧密连接&#xff0c;避免由于松动而…

JINGWHALE 虚拟现实物质与空间理论 —— 全息世界

JINGWHALE 对此论文相关未知以及已知概念、定理、公式、图片等内容的感悟、分析、创新、创造等拥有作品著作权。未经 JINGWHALE 授权&#xff0c;禁止转载与商业使用。 一、虚拟现实物质与空间理论 物质是由离散的奇点JING粒子&#xff0c;依据不同的维度粒度&#xff0c;通过…

《解锁高效合同管理系统:优化业务流程,提升管理效率》

随着企业规模的扩大和业务复杂性的增加&#xff0c;合同管理变得愈发重要。合同是企业与客户、供应商、合作伙伴之间的法律约束和商业承诺&#xff0c;而有效的合同管理系统则成为企业提高运营效率、降低风险的关键工具。本文将探讨合同管理系统的重要性以及如何利用合同管理系…

网络编程——Socket——模拟用户登录

功能一&#xff1a;模拟用户登录 功能二&#xff1a;实现客户发送登录用户信息&#xff0c;服务器端显示登录信息并响应给客户端登录成功 这里设置的用户登录信息为&#xff1a;admin&#xff0c;123456 实现&#xff1a; 1.首先&#xff0c;服务端创建并启动服务器&#x…

selenium爬取TapTap评论

上一篇写的beautifulsoup和request爬取出的结果有误。首先&#xff0c;TapTap网页以JS格式解析&#xff0c;且评论并没有“下一页”&#xff0c;而是每次加载到底部就要进行等待重新加载。我们需要做的&#xff0c;是模仿浏览器的行为&#xff0c;所以这里我们用Selenium的方式…

STM32_HAL_RTC_中断实现闹钟

1STM32设置 在STM32Cude中设置RTC//具体设置看先前发的文章 再打开闹钟中断&#xff08;如下图&#xff09; 2代码思路 2.1启动闹钟&#xff08;HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,FORMAT_BCD)&#xff09; 2.2设置回调函数&#xff08;void HAL_RTC_AlarmAEventC…

C++ VScode: launch: program ...... dose not exist

VScode: launch: program … dose not exist 介绍 参考VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09;教程配置了VSCode。在配置launch.json适用多个.c 文件编译时&#xff0c;弹出下面错误。 原因和解决方法 是task.json 默认配置的问题。 默认的 cwd参…

内网远程软件哪个好用

内网远程软件哪个好用 在现代化的办公环境中&#xff0c;内网远程软件已成为提高工作效率、实现灵活办公的重要工具。然而&#xff0c;市场上内网远程软件众多&#xff0c;究竟哪个好用呢&#xff1f;本文将为您推荐几款优秀的内网远程软件&#xff0c;并分析其特点&#xff0…

将来会是Python、Java、Golang三足鼎立吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 软件工程里没有银弹&#xff…

【Mac】Indesign 2023 Mac(ID2023) v18.5中文版安装教程

软件介绍 Adobe InDesign是一款由Adobe Systems开发的桌面排版软件&#xff0c;旨在用于创建、编辑和格式化印刷和数字出版物&#xff0c;如书籍、杂志、报纸、传单等。以下是一些关于Adobe InDesign的主要特点和功能&#xff1a; 1.强大的排版工具&#xff1a;InDesign提供了…

【Java难点】多线程-终极【更新中...】

Java内存模型之JMM 为什么需要JMM 计算机存储结构&#xff1a;从本地磁盘到主存到CPU缓存&#xff0c;也就是从硬盘到内存&#xff0c;到CPU。一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算。 CPU和物理主内存的速度不一致&#xff0c;所以设置多级缓存&am…

JAVA 双亲委派之一

JAVA 双亲委派之一 JVM类加载流程 java语言系统内置了众多类加载器&#xff0c;从一定程度上讲&#xff0c;只存在两种不同的类加载器&#xff1a;一种是启动类加载器&#xff0c;此类加载由C实现&#xff0c;是JVM的一部分&#xff1b;另一种就是所有其他的类加载器&#xf…