【C语言】常用的字符串函数使用 模拟实现

news2024/12/23 18:58:59

  • 前言
    • 字符串的组成
  • strlen
    • 模拟实现stlen
  • strcpy
    • 模拟实现strcpy
  • strcmp
    • 模拟实现strcmp
  • strcat
    • 模拟实现strcat

前言

在使用下面介绍的库函数时声明以下头文件

#include <string.h>

字符串的组成

如下字符数组 str 看似只包含abcde五个字符,实际上由6个字符组成

char str[] = "abcde";

如下
在这里插入图片描述
字符串后面默认带有字符’\0’,这是字符串的结束标志,表示这串字符到结尾了

内存中字符串长度 = 有效字符个数 + 1( ‘\0’ )

需要注意的是:
1:'\0’是给计算器看的使其知道字符串到哪就结束了,但用户不需要看这个’\0‘字符,只需要计算机显示出其字符串有效字符即可。

2:用户看到的字符串不包含’\0‘字符,所以常说的有效字符串长度不包含’\0’

strlen

先看文档该函数的声明
在这里插入图片描述
从该声明可以看出strlen函数的函数参数是字符串指针返回值是size_t类型

函数作用:返回其参数s的字符串有效长度,注意这个长度不包含’\0’
在这里插入图片描述
注意:
1:strlen不能用于测量字符,否则strlen会返回随机数
2:参数 s 所指向的字符串必须以’\0’结尾,否则strlen会返回随机数

模拟实现stlen

思路:用循环不断遍历指向字符的指针,并记录有效字符个数,字符 \0 的ASCII码值为 0 , 所以只要判断指针指向的内容为 \0 后会跳出循环即可

size_t my_strlen(const char* str)//只计算字符串长度,不修改内容所以使用const
{
	assert(str);//str不能为空
	int count = 0;
	while (*str++){//字符 \0 的ASCII码值为 0 ,所以当str指向 \0 后会跳出循环
		count++;//记录有效字符个数
	}
	return count;
}

测试:
在这里插入图片描述

strcpy

先看文档该函数的声明
在这里插入图片描述
参数 dest:是目标字符串地址
参数 src:是源字符串地址

作用:将源字符串内容(包括’\0’),拷贝到目标字符串地址中
返回值:为指向目标字符串的指针
实用方法如下:
在这里插入图片描述
使用strcpy时需注意:
1:源字符串必须以 ‘\0’ 结束。
2:strcpy会将源字符串中的 ‘\0’ 拷贝到目标空间。
3:目标空间必须足够大,以确保能存放源字符串

模拟实现strcpy

思路:
1:两个指针都不能为空否则程序会崩溃
2:保存目标字符串的的初始地址,结束时需要返回
3:将源字符串内容依次追加到目标字符串的第一个’\0’及之后的地址中,最后将源字符串的 ‘\0’ 赋值给目标字符串地址
4:将目标字符串的首地址返回

//模拟实现strcpy

char* my_strcpy(char* dest, const char* src)
{
	assert(dest && src);//保证dest和src都不为空,为空则报错
	char* ret = dest;//保存dest的初始地址

	while (*src) {//src不为'\0'就一直循环
		*dest++ = *src++;
	}
	*dest = *src;//将src'\0'赋值给dest

	return ret;//返回
}

使用方法如下:
在这里插入图片描述

strcmp

先看文档该函数的声明
在这里插入图片描述
其参数为:字符串s1和字符串s2

作用:函数strcmp的功能是比较两个字符串的大小。也就是把字符串str1和str2从首字符开始逐个字符的进行比较,直到某个字符不相同或者其中一个字符串比较完毕才停止比较。字符的比较为ASCII码的比较。

返回值:
若字符串s1大于字符串s2,返回结果大于零;
若字符串s1小于字符串s2,返回结果小于零;
若字符串s1等于字符串s2,返回结果等于零。

模拟实现strcmp

思路:
1:两个指针都不能为空否则程序会崩溃
2:两个字符串从起始字符开始,依此类推一 一对一两者字符ASCII码大小,如不相同时s1大则返回 1 ,s2大则返回-1
2:两者都为 ‘\0’ 时,表示比较结束且都相等,并返回0

//模拟实现strcmp

int my_strcmp(const char* s1, const char* s2)
{
	assert(s1 && s2);//保证dest和src都不为空,为空则报错
	while (1)
	{
		if (*s1 - *s2 != 0)//如不相同时s1大则返回 1 ,s2大则返回 - 1
		{
			return *s1 > *s2 ? 1 : -1;
		}
		if (*s1 == *s2 && *s2 == '\0')//两者都为 ‘\0’ 时,表示比较结束且都相等,并返回0
			return 0;
		//当前字符相等,两者++,进行下一个字符的比较
		s1++;
		s2++;
	}
}

使用方法如下:
在这里插入图片描述

strcat

先看文档该函数的声明
在这里插入图片描述
参数 dest:是目标字符串地址
参数 src:是源字符串地址

作用:将源字符串内容(包括’\0’),追加到目标字符串结尾(字符串的第一个’\0’)
使用方法如下:
在这里插入图片描述

注意:
1:源字符串必须以 ‘\0’ 结束。
2:目标空间必须有足够的大,能容纳下源字符串的内容。
3:目标空间必须可修改。

模拟实现strcat

思路:
1:两个指针都不能为空否则程序会崩溃
2:保存目标字符串的的初始地址,结束时需要返回
3:找到目标字符串第一个’\0’并将源字符串内容依次追加到目标字符串的第一个’\0’及之后的地址中,最后将源字符串的 ‘\0’ 赋值给目标字符串地址
4:将目标字符串的首地址返回

//模拟实现strcat
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//保证dest和src都不为空,为空则报错
	char* ret = dest;//保存dest的初始地址

	while (*dest){//循环结束后dest会指向'\0'字符
		dest++;
	};
	
	while (*src){//src不为'\0'就一直循环
		*dest++ = *src++;//将src字符赋值给dest
	}
	*dest = *src;//将src的'\0'赋值给dest

	return ret;//返回dest的初始地址
}

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

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

相关文章

随着人工智能时代的到来,算力需求的成倍增长成为新的趋势

方向一&#xff1a;AI与算力相辅相成 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是新一轮科技革命和产业变革的重要驱动力量。…

python 时间操作

写代码的时候&#xff0c;我建议还是要使用准确的时间刊一下这个结果&#xff0c;然后再减去开始的计数操作 我之前的操作是 time package from time import sleep from time import time import sys t0 time() sleep(3) t1 time()print(" cost {} s".format(…

如何使用Fiddler对手机进行弱网测试?(干货教程)

1.首先&#xff0c;fiddler连接手机 1)Tools->Options->Connections->设置端口8888&#xff0c;勾选Allow remote computers to connect 2)配置手机 注&#xff1a;手机和电脑需要在同一局域网下 手机进入网络详情&#xff0c;将代理改为手动 设置主机名、端口 主机…

python 多任务详解

1、线程① 函数方式创建线程② 自定义类创建线程 2、队列① 普通队列 Queue② 堆栈 LifoQueue③ 优先级 PriorityQueue 3、互斥锁4、进程① 函数方式创建进程② 类方式创建进程③ 进程中的队列④ 进程间通信 5、 线程与进程区别① 线程共享全局变量&#xff0c;进程不共享② 所…

Tomcat部署相关问题汇总

一.Jar包冲突 由于项目当中依赖了一些框架&#xff0c;而这些框架无法直接修改时&#xff0c;就直接本地代码写了一个同名同包路径的类&#xff0c;可以直接覆盖框架的类,但是心里不免有疑问&#xff0c;为啥本地写的同名同路径的类&#xff0c;可以覆盖三方框架的类呢&#x…

分层解耦相关知识点

这里写目录标题 三层架构简介具体案例原始代码DAO层代码service层controller层总结 分层解耦思想IOC&DI 入门简介控制反转依赖注入 IOC详解详细种类 DI详解 三层架构 简介 具体案例 原始代码 DAO层代码 分别是一个接口实现类以及一个接口&#xff0c;用接口是为了提高程…

Python pyqt5 qss美化窗口

效果 QSS QWidget#widget{background-color:#eef0f6;border-left:0.5px solid lightgray;border-right:0.5px solid lightgray;border-top:0.5px solid lightgray;border-bottom:0.5px solid #e5e5e5;border-top-left-radius: 5px;border-top-right-radius: 5px;}QWidget#widge…

Google测试之道丨如何从角色出发谈谈漫游测试?

谈到“漫游测试”&#xff0c;想必大多数人想起的都是James A.whittaker提出的全局探索性测试方法。他将软件测试比如为城市旅游&#xff0c;并划分了不同的区域&#xff08;如&#xff1a;商业区、历史区、娱乐区等等&#xff09;&#xff0c;将测试人员比喻为旅游者进行城市旅…

vue3组件通信之pinia

简述 在vue3&#xff0c;vue的状态管理也迎来了新的变更&#xff0c;在vue3使用新的组件pinia来代理原有的vuex。pinia相比vuex&#xff0c;功能收敛了不少&#xff0c;比如不直接暴露setter方式&#xff0c;外部直接修改数据 两者的概念区别 vuex:集中式管理状态容器,可以实…

java之路—— Spring IOC 的详解与基本应用

创作不易&#xff0c;给个小支持一下呗 文章目录 前言一、IOC 基本概念二、理解IOC三、基本步骤 前言 首先在了解ioc之前&#xff0c;我们要先了解Spring的基本概念。 Spring是一个开源的Java应用程序开发框架&#xff0c;它提供了一套全面的解决方案&#xff0c;用于开发企业…

从此告别网速慢,轻松掌握浏览器缓存知识点!

文章目录 I. 介绍浏览器缓存的作用提高网页加载速度减少网络带宽消耗优化用户体验 II. 浏览器缓存的原理缓存机制缓存分类1. 强缓存2. 协商缓存 III. 强缓存缓存操作流程缓存过期机制如何设置强缓存 IV. 协商缓存304 Not Modified状态码缓存操作流程如何设置协商缓存 V. 缓存失…

kubernetes核心概念 Pod

Kubernetes集群核心概念 Pod 一、工作负载(workloads) 参考链接&#xff1a;https://kubernetes.io/zh/docs/concepts/workloads/ 工作负载&#xff08;workload&#xff09;是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成&…

第2章-Java基本语法

Java基础知识图解 1. 关键字与保留字 关键字 Java保留字&#xff1a; 现有Java版本尚未使用&#xff0c; 但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字 goto 、 const 2. 标识符 Java 对各种变量、 方法和类等要素命名时使用的字符序列称为标识符…

Elasticsearch:增量快照如何工作?

作者&#xff1a;Lutf ur Rehman Elastic 提供许多由讲师指导的面对面和虚拟现场培训以及点播培训。 我们的旗舰课程是 Elasticsearch 工程师、Kibana 数据分析和 Elastic 可观测性工程师。 所有这些课程都会获得认证。如果你想更多了解这些认证方面的知识&#xff0c;请阅读文…

【CXP协议与CXP测试套件】

CXP协议 CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准&#xff0c;主要用于替代之前的Camera Link协议&#xff0c;常见于科学相机、工业相机、医学图像、航空防务等场景。CXP是一个非对称的高速点对点串行传输协议&#xff0c;主要用于传输视频和静态…

GO 微信支付V3SDK回调踩坑

通过微信官网提示安装sdk外部库 SDK&#xff0c;工具 | 微信支付商户平台文档中心 下面只讲解微信支付回调部分 先成功下一单微信支付拿到支付回调的数据&#xff0c;方便后续调试 因为在go里面打印请求参数不方便我使用的php打印全部参数&#xff0c; 圈起来的部分是我们需…

centos8.x系统安装K8S,kubernetes集群v1.23.9,docker支持的最后一个版本

1. 部署环境主机&#xff08;条件说明&#xff09; 卸载podman&#xff0c;centos默认安装了podman容器&#xff08;不管有没有&#xff0c;执行下总没错&#xff09;&#xff0c;可能与docker存在冲突 #环境准备 master 192.168.186.128 CentOS Linux release 8.5 (Core) n…

软件接口测试是什么?有哪些好用的接口测试工具?

在软件开发中&#xff0c;接口是不可避免的。软件接口测试是一种验证应用程序接口是否按照设计规范进行交互和协作的测试方法。接口测试是将模块之间的接口连接在一起以进行完整系统测试的关键部分。 当软件开发过程中不同模块之间需要数据交互&#xff0c;采用接口协议来实现…

Qt之事件过滤器讲解并且实现快捷键切换鼠标焦点

目录 1、需求背景2、使用Qt键盘事件3、安装事件过滤器4、事件处理级别 1、需求背景 现在有一个类似于下方图的ui&#xff0c;用户需要在输入前一行内容后&#xff0c;需要摁下指定案件能够跳转到下一行继续进行输入。 2、使用Qt键盘事件 一种更为直接的解决方案是子类化QLi…

【SpringCloud-6】Config配置中心

集群环境下&#xff0c;服务节点很多&#xff0c;我们不可能对每个服务都维护一套自己的配置&#xff0c;有修改时把每个节点都改一遍。 所以需要一个公共的配置文件&#xff0c;并且还能实现动态刷新。 在springcloud中&#xff0c;springcloud config组件就是一个配置中心&…