当前位置: 首页 > news >正文

C语言常见字符串函数模拟实现一:(strlen,strcpy,strcat,strcmp,strstr )

strlen模拟实现

重点:1.字符串已经'\0'作为结束标志,strlen返回的是字符串'\0'前面出现的字符个数(不包含'\0')

2.参数指向的字符串必须要以'\0'结束。

3.注意函数的返回值是size_t,是无符号的,加减是无法对比的。

模拟:

size_t my_strlen(const char* arr)
{size_t num = 0;while (*(arr++) != '\0'){num++;}return num;
}int main()
{char arr[] = "abcdef";printf("%zd\n", my_strlen(arr));
}

 strcpy模拟实现

重点:1.源字符串必须以'\0'结束

2.函数会将源字符串中的'\0'拷贝到目标空间

3.目标空间必须足够大,以确保能存放源字符串

4.目标空间必须可变

模拟:

char* my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[20];char arr2[] = "abcdef";printf("%s\n", my_strcpy(arr1, arr2));
}

strcat模拟实现

重点:1.源字符串必须以'\0'结束

2.目标空间必须足够大,能容纳源字符串的内容

3.目标空间必须可以修改

4.目标空间必须有'\0',函数找到'\0'开始追加

5.字符串不可以自己给自己追加,尽量不要。

模拟:

char* my_strcat(char* dest, const char* src)
{assert(dest && src);//断言char* ret = dest;/*while (*dest++){;}*///为什么不这么写,因为dest就不会在'\0'上了会在'\0'后面一位while (*dest){dest++;}while ((*dest++ = *src++)){;}return ret;
}int main()
{char arr1[20] = "abcd";char arr2[] = "ef";printf("%s\n", my_strcat(arr1, arr2));
}

strcmp模拟实现

重点:1.

2.比较对于位置上字符的大小(ASCLL值),不是长度。

模拟:

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0'){return 0;//要相等代表两个字符串长度和对应的字符都一模一样}str1++;str2++;}return *str1 - *str2;
}int main()
{char arr1[] = "abcd";char arr2[] = "abce";if (my_strcmp(arr1, arr2) > 0){printf(">\n");}else if (my_strcmp(arr1, arr2) == 0){printf("==\n");}else{printf("<\n");}
}

strstr模拟实现

 模拟:

#include<stdio.h>
#include<assert.h>
//strstr函数模拟,在字符串中找字符串函数char* my_strstr(const char* arr1,const char* arr2)
{assert(arr1 && arr2);char* cp = arr1;//记录起点char* s1 = arr1;//遍历的指针char* s2 = arr2;if (!*s2)//如果源字符串什么都没有直接返回目标字符串{return arr1;}while (*cp++){s1 = cp;s2 = arr2;while ((*s1 == *s2) && *s1 && *s2)//'\0'停下{s1++;s2++;}if (!*s2){return cp;}}//其实这里还可以再简洁一点return NULL;
}int main()
{char arr1[] = "abbcdef";char arr2[] = "bbc";printf("%s\n", my_strstr(arr1, arr2));
}

补充:strstr函数模拟实现还有一种 KMP算法更适合,上面的这种写法还可以再修改,大家可以自己想想。 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 最新最详细的Mastercam安装包下载安装教程(保姆级)
  • Go语言的垃圾回收(GC)机制的迭代和优化历史
  • 在HTML中添加图片
  • 使用vite+react+ts+Ant Design开发后台管理项目(二)
  • 张朝阳的物理课第三卷:量子力学的硬核探索与启发
  • 网页交互模拟:模拟用户输入、点击、选择、滚动等交互操作
  • 内外网办公环境路由配置
  • 【go/方法记录】cgo静态库编译以及使用dlv定位cgo崩溃问题
  • CNN网络训练WISDM数据集:模型仿真及可视化分析
  • 三光吊舱详解!
  • C++之 string(中)
  • Arthas vmoption(查看和修改 JVM里诊断相关的option)
  • 企业身份安全管理面临的问题和解决方案
  • 活动策划灵感TOP10分享-华媒舍
  • 分布式框架 - ZooKeeper
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 10个确保微服务与容器安全的最佳实践
  • Apache Spark Streaming 使用实例
  • HTTP中GET与POST的区别 99%的错误认识
  • Java 最常见的 200+ 面试题:面试必备
  • JAVA_NIO系列——Channel和Buffer详解
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Javascript 原型链
  • PAT A1092
  • React-flux杂记
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • windows下如何用phpstorm同步测试服务器
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 全栈开发——Linux
  • 思考 CSS 架构
  • 微服务核心架构梳理
  • 一文看透浏览器架构
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 正则表达式-基础知识Review
  • ​Redis 实现计数器和限速器的
  • ​人工智能书单(数学基础篇)
  • (33)STM32——485实验笔记
  • (7)STL算法之交换赋值
  • (arch)linux 转换文件编码格式
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (pytorch进阶之路)扩散概率模型
  • (六)激光线扫描-三维重建
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 未来三学期想要修的课 (日記)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .htaccess 强制https 单独排除某个目录
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证