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

C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现

文章目录

  • strlen的使用和模拟实现
    • 函数的原型
    • strlen模拟实现:
      • 方法1
      • 方法2
      • 方法3
  • strcpy的使用和模拟实现
    • 函数的原型
    • strcpy的模拟实现:
  • strcat的使用和模拟实现
    • 函数的原型
    • strcat的模拟实现:
  • strcmp的使用和模拟实现
    • 函数的原型
    • strcmp的模拟实现

本章的内容主要讲解这4个与字符串相关的函数的原型、使用以及模拟实现

strlen的使用和模拟实现

函数的原型

size_t strlen ( const char * str );

1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,所以结果不能为负数。
4.strlen的使⽤需要包含头⽂件string.h

strlen模拟实现:

方法1

//计数器方式
int my_strlen(const char* str)
{int count = 0;while (*str){count++;str++;}return count;
}
int main()
{const char* str1 = "fallzzzzz";int tmp = my_strlen(str1);printf("lenth = %d\n", tmp);return 0;
}

方法2

//不能创建临时变量计数器
//使用递归的方式
int my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
int main()
{const char* str1 = "fallzzzzz";int tmp = my_strlen(str1);printf("lenth = %d\n", tmp);return 0;
}

方法3

//指针-指针的⽅式 
//指针-指针的结果是两指针之间的元素个数
int my_strlen(char* str)
{char* p = str;while (*p != '\0'){p++;}return p - str;
}
int main()
{const char* str1 = "fallzzzzz";int tmp = my_strlen(str1);printf("lenth = %d\n", tmp);return 0;
}

strcpy的使用和模拟实现

函数的原型

char * strcpy ( char * destination, const char * source );

我们把source称作源字符串
我们把destination称作目标字符串
该函数为拷贝函数,可以把源字符串拷贝到目标字符串

1.源字符串必须以 ‘\0’ 结束。
2.该拷贝会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.⽬标空间必须足够大,以确保能存放源字符串。
4.⽬标空间必须是可修改的,即不为const。

strcpy的模拟实现:

char* my_strcpy(char* dest, const char* src)
{//用临时变量保存 因为之后dest和src的指针指向有变 无法直接返回指向首元素的指针char* ret = dest;assert(dest != NULL);assert(src != NULL);while ((*dest++ = *src++)){//在while的循环条件中就完成了拷贝//所以这里用空语句即可;}return ret;
}int main()
{char str1[] = "fallzzzzz";char str2[20];char* tmp = my_strcpy(str2, str1);printf("str2 = %s\n", tmp);return 0;
}

strcat的使用和模拟实现

函数的原型

char * strcat ( char * destination, const char * source );

1.源字符串必须以 ‘\0’ 结束。
2.目标字符串中也得有 ‘\0’ ,否则没办法知道追加从哪里开始。
3.⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
4.⽬标空间必须可修改,即目标字符串不为const类型。

该函数为追加字符串函数,能够在一个字符串之后追加上另一个字符串

strcat的模拟实现:

char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*dest)  //遇到'\0'停止{dest++;}while ((*dest++ = *src++)){;}return ret;
}
int main()
{char str1[] = "hello ";char str2[] = "the ";char str3[] = "fallzzzzz ";char str4[50];strcpy(str4, str1); //先将str1拷贝到str4,目的是让目标字符串中有'\0'my_strcat(str4, str2);my_strcat(str4, str3);puts(str4);  //将字符串(以‘\0’结束的字符序列)输出return 0;
}

strcmp的使用和模拟实现

函数的原型

int strcmp ( const char * str1, const char * str2 );

该函数为字符串的大小比较函数,比较的是两个字符串中对应位置上的字符的ASCII码值的大小。
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字

strcmp的模拟实现

int my_strcmp(const char* str1, const char* str2)
{int ret = 0;assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0') {//在*str1 == *str2的条件下,其中一个为'\0',那么另一个也为'\0'//两个都访问到'\0',那么就说明这两个字符串是相等的,所以跳出循环 返回0return 0;}	str1++;str2++;}return *str1 - *str2;  //将ASCII码值相减的结果作为返回值 就能通过该字符ASCII码值的大小关系比较出字符串的大小关系
}
int main()
{char* str1 = "hello";char* str2 = "fallzzzzz";int tmp = my_strcmp(str1, str2);printf("%d", tmp);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java面试题--JVM大厂篇之解密ZGC:让你的Java应用高效飞驰
  • KNN算法原理
  • Fly Catcher:通过监测恶意信号来检测飞机欺骗
  • 2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增
  • RabbitMQ-消息队列之routing使用
  • 【Python系列】 Python打印99乘法表
  • 在 Go 语言中,字符串格式化拼接可以通过多种方法实现
  • 嵌入式Linux:proc文件系统
  • Scratch魔法课堂:开启编程奇幻之旅
  • 【排序篇】实现快速排序的三种方法
  • 动手学深度学习(pytorch)学习记录9-图像分类数据集之Fashion-MNIST[学习记录]
  • Vue的本地部署
  • LVS配置
  • Facebook的区块链技术:提升数据安全与隐私保护
  • Go更换国内源配置环境变量
  • [NodeJS] 关于Buffer
  • 【Leetcode】104. 二叉树的最大深度
  • 【剑指offer】让抽象问题具体化
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • exif信息对照
  • happypack两次报错的问题
  • JAVA 学习IO流
  • MaxCompute访问TableStore(OTS) 数据
  • zookeeper系列(七)实战分布式命名服务
  • 从重复到重用
  • 分享一份非常强势的Android面试题
  • 猴子数据域名防封接口降低小说被封的风险
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 嵌入式文件系统
  • 如何实现 font-size 的响应式
  • 使用 Docker 部署 Spring Boot项目
  • 思否第一天
  • 应用生命周期终极 DevOps 工具包
  • Java性能优化之JVM GC(垃圾回收机制)
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • RDS-Mysql 物理备份恢复到本地数据库上
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​MySQL主从复制一致性检测
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #### go map 底层结构 ####
  • #数据结构 笔记三
  • (2)nginx 安装、启停
  • (C语言)逆序输出字符串
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (zt)最盛行的警世狂言(爆笑)
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (转)人的集合论——移山之道
  • ***详解账号泄露:全球约1亿用户已泄露
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net MVC4 上传大文件,并保存表单
  • .NET 材料检测系统崩溃分析
  • .NET 通过系统影子账户实现权限维持
  • .NET/C# 使窗口永不获得焦点