【C语言】模拟实现深入了解:字符串函数

请添加图片描述
🔥引言

本篇将模拟实现字符串函数,通过底层了解更多相关细节

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述


文章目录

  • 一、模拟实现字符串函数
    • 1.1 模拟实现Strlen
      • 1.1.1 方法一
      • 1.1.2 方法二:
      • 1.1.3 方法三:
    • 1.2 模拟实现Strcpy
      • 1.2.1方法一
      • 1.2.2 方法二
    • 1.3 模拟实现Strcat
    • 1.4 模拟实现Strcmp
    • 1.5 模拟实现Strncpy
    • 1.6 模拟实现Strncat
    • 1.7 模拟实现Strncmp
    • 1.8 模拟实现Strstr

一、模拟实现字符串函数


1.1 模拟实现Strlen

1.1.1 方法一

int main()
{
	char arr[] = "abcdef";
	int count = 0;//用于计算累积数
	while (arr[count] != '\0')//'\0'是不在计算的范围
	{
		count++;
	}
	printf("长度为%d\n", count);
	return 0;
}

1.1.2 方法二:

int main()
{
	char arr[] = "abcdef";
	int tap = 0;
	char* count = arr;//标记字符串的首地址
	while (arr[tap] != '\0') // \0是不在计算的范围
	{
		tap++;
		count++;
	}
	printf("长度为%d", count - arr);//指针-指针等于它们的差值
	return 0;
}

说明】:

  • 通过获得该字符串\0的位置,运用**指针(\0的位置)-指针(首位置)**等于两个指针的差值

1.1.3 方法三:

int pc(char* arr)
{
	assert(arr);//断言下
	if (*arr == '\0')//设计出口
	{
		return 0;
	}
	{
		return 1 + pc(arr + 1);
	}
}
int main()/
{
	char arr[] = "abcdef";
	printf("长值为%d", pc(arr));
	return 0;
}

说明】:

  • 字符串可以考虑使用大事化小的思想(递归)
  • 观察变化的量,得到等价关系
    在这里插入图片描述

1.2 模拟实现Strcpy

1.2.1方法一

void my_strcpy(char* dest, const char* str)
{
	while (*str != '\0')//判断拷贝结束条件
	{
		*dest = *str;//进行拷贝
		dest++;
		str++;
	}
}

说明】:

  • 两个指针指向对应的字符串,逐一拷贝
  • 虽然形参deststr是指针变量,形参不会影响到实参
  • 这里dest传递过来是地址(数组名),对此可以修改dest指向的字符串
  • dest指向的字符串需要被修改,但是src指向字符串不希望被修改

1.2.2 方法二

char* my_strcpy(char* dest, const char* str
{
    assert(dest != NULL);
    assert(str != NULL);
    char* ret = dest;//标记初始地址
    while (*dest++ = *str++)//判断和后置++打配合
    {
    }
    return ret;
}

说明】:

  • 这里实现逻辑跟方法一类似,只是这里循环判判断条件不同
  • 在循环判断语句中,完成拷贝赋值操作
  • 当str指针指向\0的位置,则表示循环结束
  • \0的ASCII码值是0(为假)
    在这里插入图片描述

1.3 模拟实现Strcat

char* my_strcat(char* p, const char* pc)
{
	assert(p != NULL);
	assert(pc != NULL);
	char* ret = p;///标记初始地址
	while (*p != '\0')//找到目标字符串的结束标记
	{
		p++;
	}
	while (*p++ = *pc++)//在结束标记的位置上追加,直到pc找到'\0'
	{
	}
	return ret;///返回初始地址
}

说明】:

  • 第一次循环:找到目标字符串的结束标记
  • 第二次循环:在结束标记的位置上追加,直到pc找到’\0’完成追加操作
    在这里插入图片描述

1.4 模拟实现Strcmp

int my_strcmp(const char* p, const char* pc)
{
	assert(p != NULL);
	assert(pc != NULL);
	while (*p == *pc)//不相等才要对比
	{
		if (*p == '\0')//找到结束位置了,说明两个字符串是相等的
		{
			return 0;
		}
		p++;
		pc++;
	}
	return *p - *pc;//用四则运算判断正负
}

说明】:

  • 循环判断是否相同
  • 相同继续向后寻找
  • 不相等则通过四则运算判断正负

1.5 模拟实现Strncpy

char* my_strncpy(char* p, const char* pc, int sz)
{
	assert(p != NULL);
	assert(pc != NULL);
	char* ret = p;//标记初始地址
	while (sz--)//拷贝次数
	{
	  *p = *pc;//拷贝开始啦!
	   p++; 
       pc++;
	}
	return ret;//返回初始地址
}

说明】:

  • 跟模拟实现strcpy逻辑类似,只是通过一个变量控制循环次数

1.6 模拟实现Strncat

char* my_strncat(char* p, const char* pc, int sz)
{
	assert(p != NULL);
	assert(pc != NULL);
	char* ret = p;//标记初始地址
	while (*p != '\0')//找到目标字符串的结束标记
	{
		p++;	
	}
	while (sz)//追加次数,注意上篇文章可能的问题
	{
		*p = *pc;
		p++;
		pc++;
	    sz--;	
	}
	return ret;//返回初始地址
}

说明】:

  • 跟模拟实现strcat逻辑类似,只是通过一个变量控制循环次数

1.7 模拟实现Strncmp

int my_strncmp(const char* p, const char* pc, int sz)
{
	assert(p != NULL);
	assert(pc != NULL);
	
		while (*p == *pc && sz--)//注意不同就是,次数作为判断条件
		{
			if (*p == '\0')//找到结束位置了,说明两个字符串是相等的
			{
				return 0;
			}
			p++;
			pc++;
		}
		return *p - *pc//用四则运算判断正负
	}

说明】:

  • 跟模拟实现strcmp逻辑类似,只是通过变量控制循环次数和是否不出现不相等

1.8 模拟实现Strstr

char* my_strstr(char* p, char* pc)
{
    assert(p && pc);
    char* dest = p;//标记初始地址
    char* str = pc;//标记初始地址
    
    if (*pc == '\0')//如果是空字符就没有不要了!
    {
        return p; 
    }
    
    while (*dest)//字符串寻找子字符串的次数
    {
        while (*p == *pc  &&  *p  && *pc)//实现逻辑
        {
            p++;
            pc++;
            if (*pc == '\0')//子字符串都对应上了
            {
                return dest;//找到位置的指针返回
            }
        }
        pc = str;//上面可能找到子字符串了,但是可惜不是回归子字符串的地址			
        dest++;
        p = dest;//dest的位置推进,地毯式搜索
    }
    
    if (*dest == '\0')//匹配完,找不到子字符串
    {
        return NULL;
    }
}

在这里插入图片描述

请添加图片描述

说明】:

  • 假设原字符串是ccpd,目标字符串cp
  • 当匹配第一个字符时,可能后继都是匹配的,也可以只是部分匹配
  • 对此需要记录这个匹配位置,通过内循环遍历一次判断是否匹配
  • 如果从这个位置不匹配,则推进一位,继续循环(暴力解法)

请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BLIP2预研笔记

0. 前言 文章是公司内部分享学习写的预研报告,里面有小部分文段是直接从网上借鉴的,侵删 1. 任务和方法历史进化: 在大模型等类似的预训练模型的方式(以包含“预训练阶段”等n阶段训练方式为特色)为主流之前&#xf…

Allegro PCB designer放置振列过空,Via Array,

首先 Place >>Via Array, 然后配置options 选项卡。 最后鼠标左击一下,拉个区域框,再点击一下。如下图 尤其注意鼠标左击一下再左击一下。

电路板维修【一】

最近喜欢上了电路板维修,经常看很多博主的维修视频,觉得还是颇有收获的(维修板子原来有方法可循),于是做笔记如下: 一.【修了半天也没找到问题,原来是检查方向错了,变频油烟机板维修…

短剧奔向小程序,流量生意如何开启?

随着移动互联网的飞速发展,小程序作为一种轻量级、易传播的应用形态,逐渐在各个领域展现出其独特的商业价值。而最近爆火的短剧小视频作为一种受众广泛的娱乐形式,与小程序结合后,不仅为观众提供了更为便捷的观看体验,…

清华团队国产“Sora”火了!画面效果对标OpenAI,长度可达16秒,还能读懂物理规律

Sora席卷世界,也掀起了全球竞逐AI视频生成的热潮。 就在今天,国内又有一支短片引发关注。 视频来自生数科技联合清华大学最新发布的视频大模型「Vidu」。 从官宣消息看,「Vidu」支持一键生成长达16秒、分辨率达1080p的高清视频内容。 更令…

JSP ssm 智能水表管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 智能水表管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采…

JSP ssm 房屋中介管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 房屋中介管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采…

羊大师:羊奶助孩子健康成长秘诀

羊大师:羊奶助孩子健康成长秘诀 在孩子的成长过程中,营养是支撑他们茁壮成长的基石。羊大师发现,羊奶作为一种天然的营养佳品,正以其独特的优势助力孩子的健康成长。 羊奶以其丰富的营养成分为孩子提供了全面的滋养。它富含蛋白质…

C++ -- 函数重载 、引用、 内联函数、auto、基于范围的for循环、指针空值nullptr

目录 1.函数重载 1.1函数重载: 1.2函数重载需要注意: 1.3函数重载的一些特殊情况 1.4为什么C语言不支持函数重载,C支持函数重载?底层逻辑是? 2.引用 2.1 引用特性 2.2 常引用 2.3 权限问题(权限放大,…

技术速递|Python in Visual Studio Code 2024年4月发布

排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展 2024 年 4 月发布! 此版本包括以下公告: 改进了 Flask 和 Django 的调试配置流程Jupyter Run Dependent Cells with Pylance 的模块和导入分析Hatch 环境发…

牛客热题:逆序对数量

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:逆序对数量题目链接方法一&…

【联通官网及APP注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

2024服贸会,参展企业媒体宣传报道攻略

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 2024年中国国际服务贸易交易会(简称“服贸会”)是一个重要的国际贸易平台,对于参展企业来说,有效的媒体宣传报道对于提升品牌知名度、扩大…

AI应用案例:运输车辆驾驶行为分析模型

随着道路交通的发展,运输行业车辆在数量增长的同时,交通事故也越发的频繁。据统计数据显示,2021年我国发生交通事故45万起,除了机动车本身的安全配置不高、车辆众多及我国路况复杂等客观原因外,从根本上讲,…

可视化数据大屏带你走进工业4.0

工业4.0是指第四次工业革命,是对工业生产的一种新的理念和模式。它通过将物理系统与数字系统相互连接,实现工业生产的智能化、自动化和网络化。工业4.0的核心目标是通过数字化技术和数据驱动的方法,实现生产过程的高度灵活性、效率和智能化。…

探索人工智能的深度神经网络:理解、应用与未来

深度神经网络(DNNs)是一种人工智能模型,其灵感来自于人脑神经元之间的连接。它们由多个层次组成,每一层都包含多个神经元,这些神经元通过权重连接在一起。信息通过网络的输入层传递,并经过一系列隐藏层&…

Verilog复习(二)| 时延

时延分为惯性延迟(Inertial Delay (Gates) )和传输延迟(Transport Delay (Nets) ) 示例: wire #5 net_1; // 5 unit transport delayand #4 (z_out, x_in, y_in); // 4 unit inertial delay assign #3 z_out a &…

Windows安装RabbitMQ教程(附安装包)

需要两个安装包 Erlang 安装包: https://download.csdn.net/download/Brevity6/89274663 (自己从官网下载也可以) RabbitMQ Windows 安装包: https://download.csdn.net/download/Brevity6/89274667 (自己从官网下载也可以) Erlang安装 Erlang安装傻瓜式下一…

2024年想要开一家抖音小店,需要多少钱?一篇详解!

大家好,我是电商糖果 随着抖音卖货的持续火爆,抖音小店也成了电商行业讨论度最大的项目之一。 不少朋友都想知道,如果今年开抖音小店大概需要多少钱。 糖果做小店的时间也比较长,也经营了多家小店。 对于开一家抖音小店需要多…

蓝桥杯EDA客观题

目录 前言 一、PCB类知识点和题目分析 1.电阻 2.电容 3.封装类 4.单位转换类 5.电路板结构类 6.PCB绘制规则 7.立创软件 8.PCB硬件 线性电源和开关电源 二、数电知识点和题目分析 1.门电路 2.逻辑代数 3.组合逻辑电路 4.触发器 5.时序逻辑电路 6.其他 三、模…