目录

一.strlen函数模拟实现

1.循环计数器实现

2.递归实现

3.指针相减法实现

二.strcpy模拟实现

附:strncpy的模拟实现

三. strcat 模拟实现

附:strncat模拟实现

四. strcmp的模拟实现

附:strncmp模拟实现


一.strlen函数模拟实现

库函数strlen首部:             size_t strlen( const char *string );

返回值size_t 是typedef的unsigned int类型

该函数返回字符串中的'\0'前面出现的字符个数

1.循环计数器实现

size_t my_strlen (const char* arr)
{assert(arr);int count =0;while(*arr++){count++;}return count;
}

形参中的const用于保护arr所指向的内存空间,防止其被修改

assert用于判断arr是否为空指针,若arr为空指针,程序会在终端中输出警告

(assert的形参接收的是一个判断表达式,表达式若为假则输出警告,arr为空指针时,表达式的值为0表示假)

2.递归实现

size_t my_strlen (const char* arr)
{assert(arr);if(*arr!='\0'){return 1+ my_strlen(arr+1);}else{return 0;}
}

3.指针相减法实现

size_t my_strlen (const char* arr)
{assert(arr);const char * arrend=arr;while(*arrend){arrend++;}return arrend-arr;
}

二.strcpy模拟实现

库函数首部:   char *strcpy( char *strDestination, const char *strSource );

功能是将const char *strSource指向的字符串以覆盖的方式拷贝到char *strDestination指向的内存空间中。

拷贝以const char *strSource指向的字符串中的'\0'作为结束标志。

并且会将const char *strSource指向的字符串中的'\0'拷贝到目标空间中。

char * my_strcpy(char * dest,const char* src)
{assert(dest && src);char * destcpy = dest;while(*destcpy++ = *src++){;}return dest;
}

附:strncpy的模拟实现

函数首部 :char *strncpy( char *strDest, const char *strSource, size_t count );

函数功能是将strSource指向的字符串中前count个字符以覆盖的方式拷贝到strDest所指向的字符串中。

如果count 小于或等于strSource所指向的字符串的长度,则函数不会向strDest所指向的字符串中添加'\0'.

如果count 大于strSource所指向的字符串的长度,则函数会向strDest所指向的字符串中添加count- strlen(strSource)个'\0'.

char * my_strncpy (char * dest , const char * src, size_t count)
{char * ret= dest;assert(dest && src);while(count && (*dest++ = *src++)){count--;}if(count){while(--count){*dest++ = '\0';}}return ret;
}

三. strcat 模拟实现

函数首部:char *strcat( char *strDestination, const char *strSource );

函数的功能是将const char *strSource 指向的字符串连接到char *strDestination所指向的字符串后部。

注意 char *strDestination和const char *strSource不能指向同一个内存区块(即该函数不能用于字符串连接自身)

char * my_strcat (char * dest, const char * src)
{assert(dest && src);char * destcat =dest;while(*destcat){destcat++;}while(*destcat++ = *src++);return dest;
}

附:strncat模拟实现

函数首部:char *strncat( char *strDest, const char *strSource, size_t count );

函数功能是将strSource所指向的字符串中前count个字符连接到strDest所指向的字符串后部。完成字符串连接后函数会在strDest所指向的字符串后补上一个'\0'.

如果count大于strSoure所指向的字符串的长度,则strncat函数的执行效果与strcat函数的执行效果一样。

char * my_strncat (char* Dest , const char * src, size_t count)
{assert(Dest && src);char * ret =Dest;while(*Dest){Dest++;}while(count && (*Dest++ = *src++)){count--;}if(!count){*Dest ='\0';}return ret;
}

 该函数可以用于字符串连接自身。

四. strcmp的模拟实现

函数首部:int strcmp( const char *string1, const char *string2 );

函数功能是将const char *string1指向的字符串和const char *string2 指向的字符串中的字符进行逐个比较。若两个字符串的每个字符都相同,则函数返回0,若双指针找到了两个字符串中的不同字符,则函数返回这两个不同字符的差值(*string1 -  *string2).

注意:

若两个字符串的每个对应字符都相同,则以'\0'作为比较结束的标志。

若两个字符串存在不同的对应字符,则以对应字符不同这一判断条件作为比较结束的标志。

库中对该函数返回值的描述

Return Value Relationship of string1 to string2
<0 string1 less than string2
>0 string1 greater than string2
==0 string1 identical to string2

由于e的ASCII值大于d的ASCII值,所以我们认为string2指向的字符串大于string1指向的字符串

int my_strcmp (const char * arr1, const char * arr2)
{assert(arr1 && arr2);while(*arr1 == *arr2){if(!(*arr1)){return 0;}arr1++;arr2++;}return *arr1 - *arr2;
}

附:strncmp模拟实现

函数首部:int strncmp( const char *string1, const char *string2, size_t count );

函数功能是比较两个字符串的前count个字符

函数的返回值约定与strcmp类似

int my_strncmp(const char * arr1, const char * arr2 , size_t count)
{assert(arr1 && arr2);while(count && *arr1==*arr2){if(!(*arr1)){return 0;}arr1++;arr2++;count--;}if(!count){return 0;}return *arr1 - *arr2;
}

学习笔记3:字符串库函数模拟实现(上)相关推荐

  1. Windows进程与线程学习笔记(五)—— 模拟线程切换

    Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...

  2. 1.C#基础学习笔记3---C#字符串(转义符和内存存储无关)

    技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com ------------------------------------- ...

  3. Intel VT学习笔记(三)—— VMCS(上)

    Intel VT学习笔记(三)-- VMCS(上) 要点回顾 VMCS 设置字段 错误排查 Fields Host-State Area VM-Control Fields 代码实现 参考资料 要点回 ...

  4. 【计算机网络学习笔记12】交换技术(上)

    [计算机网络学习笔记12]交换技术(上) 经典局域网的交换技术 概念 以太网是由Xerox公司创建并由Xerox.intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用的最通用的通信协议 ...

  5. 「学习笔记」品优购项目-上(页面公共部分 )

    「学习笔记」品优购项目-上 品优购项目-上 目标 品优购项目规划 网站制作流程 品优购项目介绍 品优购项目的学习目的 开发工具以及技术栈 开发工具 技术栈 品优购项目搭建工作 创建的文件夹如下(称为项 ...

  6. STM32F407霸天虎FreeRTOS学习笔记——移植FreeRTOS到开发板上

    STM32F407霸天虎FreeRTOS学习笔记--移植FreeRTOS到开发板上 FreeRTOS源码获取 移植第一步:创建文件夹 Keil main.c 实验效果 FreeRTOS源码获取 在移植 ...

  7. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  8. Qt学习笔记之 字符串类型小结

    1. Qt常用字符串类型 1.1 QString QString是Unicode编码的字符串,存储一系列16位的QChar,每一个QChar对应一个Unicode 4.0编码的字符,详见<Qt学 ...

  9. 「学习笔记」HTML5CSS3提高6(上)

    「学习笔记」HTML5&CSS3提高6(上) HTML5新特性 概述 语义化标签 (★★) 多媒体标签 视频标签- video(★★★) 基本使用 兼容写法 video 常用属性 音频标签- ...

最新文章

  1. 安装没有在R包仓库CRAN上托管的R包
  2. terminal怎么运行c语言文件,在mac电脑的terminal里该如何运行c语言
  3. 2021年辽宁省大学生数学建模竞赛题目A题_智慧停车的运营、管理规划
  4. RxJava系列6(从微观角度解读RxJava源码)
  5. boost::geometry::assign用法的测试程序
  6. mfc点击按钮让对话框关闭_WinXP系统开始菜单中关机按钮消失的恢复教程
  7. 高考python必考题目_假如高考考python编程,这些题目你会几个呢?
  8. batchplot放到哪个文件夹_Batchplot使用技巧,转换CAD图纸格式并实现批量打印
  9. Chirpy Zippy工具使用心得
  10. cisco显示ip地址_cisco视频会议,会议室两台电视、一个投影线路如何连接布线
  11. utilities(C/C++)(二)
  12. pycharm的markdown文件编写
  13. java反射机制历史_java的反射机制浅谈
  14. 解决Ubuntu 14.04下CodeBlocks缩进异常问题
  15. Java 类图(UML)
  16. android图片添加文字,android图片上添加文字
  17. 服务器使用CDN加速的优劣势分析
  18. iphone 的文件目录和简单介绍
  19. deepin 安装vscode
  20. thinkphp5.1 || 给图片添加文字,图片水印

热门文章

  1. maya包裹表情变形_MAYA制作逼真的人物表情之变形制作教程
  2. Docker容器恢复
  3. easyexcel分页导出多个excel
  4. 全功能WebRTC应用程序AppRTC应用服务阿里云搭建测试总结并docker化提供镜像
  5. 搭建Gitolite
  6. 普歌-飞灵团队-ES9
  7. 网页实现发送邮箱验证码
  8. 为什么不应该买小房换大房?
  9. 一个思想超前的低代码平台主要实现思路
  10. php 取整,PHP取整的方法有哪些