模拟实现一些库函数(1)(上)

简介: 模拟实现一些库函数(1)

函数介绍

本章内容会给大家展示

求字符串长度

strlen

长度不受限制的字符串函数

strcpy

strcat

strcmp

长度受限制的字符串函数介绍

strncpy

strncat

strncmp

字符串查找

strstr

并将这些函数全部模拟出来,带给大家。

字符串长度strlen函数

这个函数是用来实现求字符串长度的,话不多说我们上代码。

int main()
{
  char str[] = "ABCDEFGHIJK";
  int sz=strlen(str);
  printf("%d", sz);
  return 0;
}

那么我们来实现模拟strlen函数

#include<assert.h>
int my_strlen(const char* str)
{
  assert(str);
  int i = 0;
  while (*str != '\0')
  {
    str++;
    i++;
  }
  return i;
}
int main()
{
  char str[] = "ABCDEFGHIJK";
  int sz=my_strlen(str);
  printf("%d", sz);
  return 0;
}

我们知道strlen函数是以接收到’\0’为信号来计算的,所以我们传参传过去的是数字名也就是数组首元素地址,在自定义函数中我们只是计算数组长度,并不希望改变原数组,所以我们可以用const来修饰,为了防止穿过来的是空指针,我们用assert函数,不过需要引入一个<assert.h>的头文件。

长度不受限制的函数

strcpy

strcpy函数是字符串拷贝函数,我们直接看效果,上代码,来模拟。

int main()
{
  char str1[] = "************";
  char str2[] = "hello world";
  strcpy(str1, str2);
  printf("%s\n", str1);
  return 0;
}

接下来我们直接来实现

char* my_strcpy(char* str1, const char* str2)
{
  char* ret = str1;
  assert(str1 && str2);
  while ((*str1++ = *str2++))
  {
    ;
  }
  return 0;
}
int main()
{
  char str1[] = "************";
  char str2[] = "hello world";
  my_strcpy(str1, str2);
  printf("%s\n", str1);
  return 0;
}

首先,strcpy需要两个参数一个是拷贝数组,一个是拷贝目标数组,而拷贝目标数组我们不希望他被改变所以用const来修饰,为了防止传参过来的是空指针所以两个参数我们都用assert函数来检验。之后再用while循环来实现字符拷贝,因为strcpy函数返回的是拷贝字符串首地址,所以我们设置ret来接受首地址,最后返回ret即可。

strcat

strcat是拼接函数,我们依然先看效果。

int main()
{
  char str1[20] = "ABCD";
  char str2[] = "EFGH";
  strcat(str1, str2);
  printf("%s", str1);
  return 0;
}

了解了效果之后,我们来实现模拟。

char* my_strcat(char* str1,const char* str2)
{
  char* ret = str1;
  assert(str1 && str2);
  while (*str1 != '\0')
  {
    str1++;
  }
  while ((*str1++ = *str2++))
  {
    ;
  }
  return ret;
}
int main()
{
  char str1[20] = "ABCD";
  char str2[] = "EFGH";
  my_strcat(str1, str2);
  printf("%s", str1);
  return 0;
}

其实,追加函数和拷贝函数的原理很相似,只不过是从拷贝函数的末尾开始拷贝,所以我们设置一个循环,跳过追加目标函数的所有字符从’\0’,开始拷贝,接下来就和strcpy函数一样了。

目录
相关文章
|
人工智能 自然语言处理 安全
AI战略丨新一代 AI 应用: 穿透场景,释放价值
在深入理解技术特性、准确把握应用场景、科学评估实施条件的基础上,企业才能制定出符合自身实际的战略。
AI战略丨新一代 AI 应用: 穿透场景,释放价值
|
3月前
|
应用服务中间件 Linux 网络安全
使用Nginx免费版与Keepalived实现高可用性High Availablity方案
本文介绍了如何使用Nginx免费版与Keepalived实现高可用性(HA)方案,涵盖环境搭建、Keepalived安装配置、版本升级及主从模式设置。通过虚拟机测试,结合CentOS与宝塔,详细说明VIP配置与服务启动流程,助你构建稳定可靠的Web高可用架构。
|
NoSQL MongoDB 数据安全/隐私保护
Docker 安装MongoDB 以及 相关配置文件、数据文件映射
本文是博主使用docker安装mongodb的方法记录,希望对大家有所帮助。
2235 0
|
10月前
|
缓存 人工智能 算法
深度揭秘复杂异构硬件推理优化
本文介绍了大语言模型在部署推理层面的性能优化工作,涵盖高性能算子、量化压缩、高效运行时及分布式调度四个方面。面对参数和上下文规模增长带来的显存、缓存与计算开销挑战,文中详细探讨了如何通过优化算子性能、低精度量化压缩、异步运行时框架设计以及多层次分布式架构来提升大模型推理效率。此外,还展示了BladeLLM引擎框架的实际应用效果,证明了这些技术在高并发场景下的显著性能提升。
|
8月前
鸿蒙开发:了解@Builder装饰器
@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁,有两点需要注意,一是,是用私有还是全局,取决于当前的组件的复用机制,如果多个页面都使用了,建议以全局为主;二是传参的动态更新,有更新就使用引用参数传递,没有更新按值传递即可。
405 28
鸿蒙开发:了解@Builder装饰器
|
11月前
|
机器学习/深度学习 人工智能 JavaScript
JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景
本文探讨了JavaScript和TypeScript的未来发展趋势及其在Web开发中的应用前景。JavaScript将注重性能优化、跨平台开发、AI融合及WebAssembly整合;TypeScript则强调与框架整合、强类型检查、前端工程化及WebAssembly的深度结合。两者结合发展,特别是在Vue 3.0中完全采用TypeScript编写,预示着未来的Web开发将更加高效、可靠。
481 4
|
数据采集 数据可视化 定位技术
倾斜摄影教程:无人机航拍后使用ContextCapture生成 3D模型
倾斜摄影建模利用多角度影像生成高精度三维模型,广泛应用于城市规划、遗产保护等领域。通过无人机拍摄与专业软件处理,实现真实感强、自动化程度高的实景建模。
倾斜摄影教程:无人机航拍后使用ContextCapture生成 3D模型
|
Ubuntu Linux
Linux查看系统发行版版本信息
在Linux中查看系统发行版版本信息有多种方法,包括使用`lsb_release`命令、查看`/etc/*-release`文件、`uname -a`、`/proc/version`、YUM或APT命令,以及特定发行版文件和命令。图形界面和在线资源也是获取信息的途径。不同的方法适用于不同系统配置。
711 0
|
缓存 编译器 程序员
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
C/C++编译器链接优化技术:链接优化是在编译器和链接器之间进行的优化
571 0
|
Python
ModuleNotFoundError: No module named ‘IPython‘
ModuleNotFoundError: No module named ‘IPython‘
404 0