C语言模拟实现字符串处理函数

需要多一点点勇气,来面对变差的自己

大家好,我是纪宁。

这篇文章为大家带来的是5大字符串处理函数的模拟实现。

文章目录

1.strlen函数的模拟实现 

2.strcpy函数的模拟实现

3.strcmp函数的模拟实现

4.strcat函数的模拟实现

5.strstr函数的模拟实现


1.strlen函数的模拟实现 

  strlen函数的作用是求字符串的长度

  strlen的函数原型

常规方法

  找 ‘\0’ ,将字符串首地址传递过来,解引用后的值不是‘\0’的话,指针位置就后移,同时计数器count加1,知道指针解引用后的值为‘\0’,循环停止,函数返回计数器count的值

size_t my_strlen(char* str)
{size_t count = 0;while (*str != '\0'){count++;str++;}return count;
}int main()
{char str[1000] = "I have a my_strlen hanshu";size_t len = my_strlen(str);printf("%zu", len);return 0;
}

指针减指针

  将字符串首元素地址传过来之后,先用字符指针保存,再将保存的指针移动,找‘\0’,找到‘\0’后,用这个位置的指针减去字符串首元素地址即为字符串长度

  指针减去指针得到的值为两指针之间的元素个数

size_t my_strlen(char* str)
{char* str2 = str;while (*str2 != '\0')str2++;return str2 - str;
}
int main()
{char str[1000] = "I have a my_strlen hanshu";size_t len = my_strlen(str);printf("%zu", len);return 0;
}

递归

  递归方法的核心就是大事化小

  但要注意递归必须有条件,并且每次递归都要越来越接近这个条件

  当传递过来的指针解引用为‘\0’时,说明递归结束,否则就指针后移继续递归

size_t my_strlen(char* str)
{if (*str == '\0')return 0;elsereturn my_strlen(str + 1) + 1;
}
int main()
{char str[1000] = "I have a my_strlen hanshu";size_t len = my_strlen(str);printf("%zu", len);return 0;
}

2.strcpy函数的模拟实现

  strcpy函数的作用是拷贝字符串

  strcpy的函数原型

注意事项:

  •   拷贝字符串,必须将 ‘\0’ 也拷贝过去 
  •   目表字符串必须是可变的,不能是常量字符串
  •   函数要返回目标字符串的首地址,所以要先将首地址存起来
#include<assert.h>
char* my_strcpy(char* str1, const char* str2)
{assert(str1 && str2);char* ret = str1;while (*str2 != '\0'){*str1 = *str2;str1++;str2++;}*str1 = *str2;return str1;
}
int main()
{char str1[100] = { "0" };char str2[100] = "my_strcpy hanshu";my_strcpy(str1, str2);return 0;
}

3.strcmp函数的模拟实现

  strcmp函数的作用是字符串比较

  strcmp函数原型

 注意事项:

  当str1>str2时返回一个大于0的数,str1<str2时返回一个小于0的数,str1=str2时返回0,所以模拟实现时,当str1!=str2时,可以用 *str1-*str2 来表示返回值

//实现strcmp函数
#incldue<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 && *str2){if (*str2 == *str1){str1++;str2++;}elsereturn *str1 - *str2;}if (*str1 == *str2 && *str1 == '\0')return 0;
}
int main()
{char str1[100] = "abcdefg";char str2[100] = "abcdefr";if (my_strcmp(str1, str2) > 0)printf("str1>str2\n");elseprintf("str2>str1\n");return 0;
}

4.strcat函数的模拟实现

  strcat函数的作用是实现字符串的连接

  strcat函数原型

   实现strcat函数的时候,要先找到‘\0’,然后再模仿字符串拷贝函数的实现将字符串拷贝过去即可,且‘\0’也必须拷贝过去

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* str1, const char* str2)
{assert(str1&&str2);char* ret = str1;//先找str1的  \0while (*++str1);//将str2拷贝过来while (*str2 != '\0'){*str1 = *str2;str1++;str2++;}*str1 = *str2;return ret;
}
int main()
{char arr1[100] = "jining ";char arr2[100] = "bu shi da yuan zhong";my_strcat(arr1, arr2);printf("%s", arr1);return 0;
}

5.strstr函数的模拟实现

  strstr函数的作用是在字符串中找子字符串

  strstr函数原型

实现strstr函数要设置两重循环,外层循环控制目标字符串的指针位置,判断是否有指针解引用后与子字符串的首字符相同,若相同,再用内层循环判断子字符串是否为目标字符串的一部分

#include<string.h>
char* my_strstr(const char* str1, const char* str2)
{char* str3 = str1;int i = 0;for (i = 0; i < strlen(str1); i++){int count = 1;if (*(str3 + i) == *str2){int j = 0;for (j = 1; j < strlen(str2); j++){if (*(str3 + i + j) == *(str2 + j) && *(str2 + j) != '\0')count++;}if (count == strlen(str2))return (str1 + i);}}return NULL;
}
int main()
{char str1[100] = "zyb is a big yuanzhong is zyb TT";char str2[100] = "ong";char* ret = my_strstr(str1, str2);printf("%s", ret);return 0;
}

在这里插入图片描述

  博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你真是 泰     裤    辣 !!!

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

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

相关文章

软件测试|SQL常用语法,你都会吗?

前言 SQL作为一门语言&#xff0c;和其他编程语言一样&#xff0c;都是需要遵循一些特定的规范和准则的&#xff0c;这也就是我们常说的语法&#xff08;Syntax&#xff09;。 下面是几个SQL的语法规则&#xff1a; 所有的 SQL 语法都必须以关键字&#xff08;也称命令&…

04-spring配置文件加载过程

文章目录 spring配置文件加载过程 spring配置文件加载过程 调用refresh方法中obtainFreshBeanFactory() Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者&#xff1a;Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的&#xff0c;Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速&#xff0c;从简单的关键字到繁重的 KNN 向量&#xff0c;以及摄取管道繁重的摄取工作负载。 摄取涉及…

推荐10个Flutter开源项目

作为跨平台应用开发的领头羊,Flutter从已发布就受到广大开发者的追捧。使用Flutter技术开发的应用不仅体验上无限接近原生应用,在开发效率上也是其他技术无法比拟的。随着其开发者社区的不断壮大,Flutter生态系统已经相当强大,并且众多开源应用程序也相继诞生。这些开源应用…

ceph--cephFS的使用

ceph分布式存储—cephFS的使用 1、cephfs的概念 ceph FS 即 ceph filesystem&#xff0c;可以实现文件系统共享功能,客户端通过 ceph 协议挂载并使 用 ceph 集群作为数据存储服务器。 Ceph FS 需要运行 Meta Data Services(MDS)服务&#xff0c;其守护进程为 ceph-mds&#x…

MongoDB

安装 数据存放路径&#xff1a;D:\data\db 安装目录&#xff1a;D:\MongoDB\mongodb-windows-x86_64-5.0.19\mongodb-win32-x86_64-windows-5.0.19\bin 配置环境变量 开启服务端&#xff0c;客户端 # 开启服务端&#xff0c;指定数据存放路径 mongod --dbpath D:\data\…

【HCIA】11.ACL与NAT地址转换

ACL 通过ACL可以实现对网络中报文流的精确识别和控制&#xff0c;达到控制网络访问行为、防止网络攻击和提高网络带宽利用率的目的。 ACL是由permit或deny语句组成的一系列有顺序的规则的集合&#xff1b;它通过匹配报文的相关字段实现对报文的分类。ACL是能够匹配一个IP数据包…

vue 通过多组复选框来过滤数据

1.通过if else 来筛选数据 <template> <div><div><label><input type"checkbox" v-model"checkedNames" value"北京"> 北京</label><label><input type"checkbox" v-model"chec…

【Web UI自动化测试】Web UI自动化测试之框架篇(全网最全)

本文大纲截图&#xff1a; UnitTest框架&#xff1a; PyTest框架&#xff1a; 框架&#xff1a; 框架英文单词 framework&#xff0c;为解决一类事情的功能的集合。需要按照框架的规定&#xff08;套路&#xff09;去书写代码。 一、UnitTest框架介绍【文末分享自动化测试学习…

【iOS】—— 编译链接

【iOS】—— 编译链接 文章目录 【iOS】—— 编译链接编译流程预处理&#xff08;预编译Prepressing&#xff09;编译&#xff08;Compilation&#xff09;汇编&#xff08;Assembly&#xff09;链接&#xff08;Linking&#xff09; 编译流程 编译流程分为四步 预处理&#…

Windows搭建Nginx实现RTMP转为HLS流

所需软件 nginx-1.7.11.3-Gryphon&#xff08;这个包含必须的RTMP模块&#xff0c;普通的Ngxin没有这个&#xff09;ffmpegVLC 配置Nginx 1为Nginx配置RTMP和HLS 这里定义了一个叫live的RTMP路径。同时设置其开启HLS功能&#xff0c;那么所有推送到这个地址的RTMP流都会自动生…

csapp 深入理解计算机系統 笔记

csapp 深入理解计算机系統 笔记 参考lab 第1章&#xff1a;计算机系统漫游第 2 章&#xff1a;信息的表示和处理Data Lab 第03章&#xff1a;程序的机器级表示Bomb Lab 参考 计算机速成课 | Crash Course 字幕组 (全40集 2018-5-1 精校完成)csapp重点解读深入理解计算机系統 c…