c语言:模拟实现各种字符串函数

strlen函数:

功能:获取到\0之前的的字符个数。 

代码模拟实现函数:

//strlen
//这里用了递归法,
//如abc,1+bc,然后1+1+c,接着1+1+1,最后读取到\0,1+1+1+0,得到结果3。size_t my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
int main()
{char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

 


strcpy函数:

功能:拷贝一个指定的字符串

代码模拟实现函数: 

//strcpy
char* my_strcpy(char* dest, char* str)
{char* ret = dest;assert(dest && *str);//断言,如果其中有一个为空指针,停止运行,保护程序while (*dest = *str){dest++;str++;}return ret;
}
int main()
{char arr1[20] = { 0 };//被拷入数组char arr2[] = "abcdef";//拷入数组my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

strcmp函数:

功能:比较两个字符串的对应的ascll码值大小(从左到右对应的ascll码值大小)

代码模拟实现函数: 

int my_strcmp(const char* s1, const char* s2)
{while (*s1 == *s2){if (*s1 == '\0')return 0;//读取到\0时仍然相等,说明两个字符串完全一样s1++;s2++;}return *s1 - *s2;
}
int main()
{int ret = my_strcmp("abcdef", "abc");if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}

 strcat函数:

功能:粘贴两个字符串 

代码模拟函数实现: 

//strcat
char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);//断言//找到目标空间,也就是第一个字符串的结尾的\0while (*dest){dest++;}//拷贝while (*dest = *src){dest++;src++;}return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

strstr函数: 

功能:在较长数组1中看是否能找到较短数组2,如果存在,打印数组1中数组2的字符串起始位置到结束

代码模拟函数实现: 

//strstr
char* my_strstr(char* str1, char* str2)
{const char* cur = str1;//记录数组1的起始位置const char* s1 = NULL;const char* s2 = NULL;//创建两个空指针,用来模拟数组地址的变化assert(str1 && str2);//断言if (*str2 == '\0'){return (char*)str1;//str2历遍完全部字符了,且符合条件,记录str1的位置}while (*cur)//进入判断条件,建议画图模拟一下,用abbbbcdef和bbc这两个数组能找出所有可能发生的情况{s1 = cur;s2 = str2;while (*s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)cur;//此时,找到符合位置的地址,返回str1此时历遍到的位置}cur++;}return NULL;//历遍完全部数组,仍没有找到,说明a数组中不存在符合b数组的字符串
}
int main()
{char arr1[]="abcdef";char arr2[] = "bcd";char* ret = my_strstr(arr1, arr2);if (ret != NULL)printf("%s\n", ret);elseprintf("找不到\n");return 0;}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apollo接入配置中心 -- 源码分析之如何获取配置

全文参考:https://mp.weixin.qq.com/s/G5BV5BIdOtB3LlxNsr4ZDQ https://blog.csdn.net/crystonesc/article/details/106630412 https://www.cnblogs.com/deepSleeping/p/14565774.html 背景:近期在接入行内配置中心,因此对配置的加载接入有了…

亚马逊Listing怎么写!亲身经验分享

亚马逊运营的重要环节之一,listing的攥写,可以决定了产品的搜索排名,用户的点击率和转化率,那么如果你的产品排名或者转化不理想的情况,可以考虑对listing进行优化,在关键词过多和语句流程通顺的情况下&…

Spring Cloud LoadBalancer 简单介绍与实战

前言 本文为SpringCloud的学习笔记,如有错误,希望各位高手能指出,主要介绍SpringCloudLoadBalancer的基本概念和实战 文章目录 前言什么是LoadBalancer负载均衡分类服务端负载均衡客户端负载均衡服务端负载均衡和客户端负载均衡的优缺点 常见…

数据挖掘之PCA-主成分分析

PCA的用处:找出反应数据中最大变差的投影(就是拉的最开)。 在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的 但是什么时候信息保留的最多呢?具体一点&#…

SQLite 和 SQLiteDatabase 的使用

实验七:SQLite 和 SQLiteDatabase 的使用 7.1 实验目的 本次实验的目的是让大家熟悉 Android 中对数据库进行操作的相关的接口、类等。SQLiteDatabase 这个是在 android 中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删…

Stable Video Diffusion重磅发布,快来看看哪些功能

本周,有关 OpenAI 宫斗的报道占据了Ai圈版面的主导地位,吃够了奥特曼的大瓜。我们来看看Stability AI刚发布的Stable Video Diffusion,这是一种通过对现有图像进行动画处理来生成视频的 AI 模型。基于 Stability 现有的Stable Diffusion文本到…

优秀的5款字体设计软件推荐

字体设计作为设计中的一个重要模块,如果字体软件选择正确,将给字体设计工作带来极大的便利,易于使用的字体设计软件,可以创造出优秀的排版设计。在日常工作中,设计师可能会在字体网站上下载字体,然后安装字…

Grafana 如何实现雷达图

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

Windows核心编程 进程

目录 一、进程概述 二、创建进程相关API Winexec ShellExecute CreateProcess 三、进程退出相关API ExitProcess TerminateProcess GetCurrentProcess GetExitCodeProcess 四、如何理解虚拟内存空间 五、关于UAC 一、进程概述 进程:正在运行的程序 程…

[C/C++]数据结构 循环队列

前言: 队列是一种具有先进先出特性的结构,但是当数据出队列以后,前面的空间就无法再次利用了,循环队列就可以解决这个问题 一:概念及结构: 1.循环队列概念 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队…

Intel Software Guard Extensions简介(一)

文章目录 前言一、简介二、enclave相互作用与保护三、enclave生命周期四、数据结构和enclave操作五、enclave page cache六、enclave instructions and intel sgx参考资料 前言 最近开始研究Intel SGX硬件特性,记录下研究过程。 目前安全性主要关注对存储中的静止…

一篇总结 Linux 系统启动的几个汇编指令

学习 Linux 系统启动流程,必须熟悉几个汇编指令,总结给大家。 这里不是最全的,只列出一些最常用的汇编指令。 一.数据处理指令 1.数据传送指令 【MOV指令】 把一个寄存器的值(立即数)赋给另一个寄存器,或者将一个…