
03-C语言进阶——模拟实现字符串操作函数
字符串操作函数的细节参看上一篇博客 Github源码下载地址: char *p=str就是错误的,因为str是常量指针,如果赋值给p就是让p的类型也变为常量指针,这种做法是错误的,类型不匹配。
发布日期:2021-05-07 00:27:15
浏览次数:10
分类:技术文章
本文共 2414 字,大约阅读时间需要 8 分钟。
模拟实现字符串操作函数
1.模拟实现strcat
//1.模拟实现strcatchar * my_strcat(char *destination, const char * source){ //首先定义一个指针指向destination起始地址,便于操作完成后返回原始字符串的首地址 char *dest = destination; //判断两个字符串是否为空 assert(destination != NULL); assert(source != NULL); //第一轮循环让destination指向\0 while (*destination) { destination++; } //第二轮循环将source内容追加给destination while ((*destination++ = *source++)) { ; } //返回dest起始地址 return dest;}
2.模拟实现strcmp
//2.模拟实现strcmpint my_strcmp(const char *str1, const char *str2){ //判断指针合法性 assert(str1 != NULL); assert(str2 != NULL); //两个字符串分别从第一个字符进行比较 while ( (*str1++) && (*str2++) ) { if (*str1 > *str2) { return 1; } else if (*str1 < *str2) { return -1; } else { continue; } } return 0;}
3.模拟实现strcpy
//3.模拟实现strcpychar * my_strcpy(char * destination, const char *source){ //判断指针合法性 assert(destination!=NULL); assert(source!=NULL); //先定义一个指针指向destination便于复制后返回首地址 char *ret = destination; //将第二个字符串的每个字符依次复制到destination中 while ((*destination++ = *source++)) { ; } return ret;}
4.模拟实现strlen
4.1 计数器方式
//4.1计数器int my_strlen(const char *str){ //定义一个计数器 int count = 0; //循环扫描字符串直到'/0' while (*str) { //计数器+1,字符串指针+1 count++; str++; } return count;}
4.2 不创建临时变量计数器(递归)
//4.2不创建临时变量计数器,采用递归的方式int my_strlen2(const char *str){ if (*str == '\0') { return 0; } else { return 1 + my_strlen2(str + 1); }}
4.3 指针-指针的方式
思路:采用双指针的方法
首先第一个指针指向字符串首地址(也就是传入形参字符串变量的首地址),第二个指针用于遍历到字符串结束,其次第二个指针值减去第一个指针值即为字符串长度 举个栗子:假设字符串“abcd”,a的起始地址为1,第一个指针s指向a,第二个指针遍历结束后指向d后面的‘\0’,即s=1,p=5,p-s=4,就是字符串的长度。 注意:由于使用双指针,因此定义形参不能使用const 原因:形参const char * str是一个常量指针,再定义一个指针变量char *p,这时候//4.3 双指针//a.第一个指针指向字符串首地址,第二个指针遍历到字符串结束//b.第二个指针减去第一个指针即为字符串长度//注意:由于使用双指针,因此形参不能使用constint my_strlen3(char *str){ //定义指针p用于遍历字符串 char *p = str; //遍历字符串str while (*p) { p++; } return p - str;}
5.模拟实现strstr
strstr的优化可以参考以下博客
//5.模拟实现strstrconst char *my_strstr(const char* str, const char* sub_str){ //判断指针合法性 assert(str != NULL); assert(sub_str != NULL); //双层循环实现字符串子串查找 //外层循环控制str起始位置,一直向后移动直到\0 while (*str) { //定义两个指针变量方便返回字符串起始地址 const char *p = str; const char *q = sub_str; //内层循环用于判断str字符串是否包含sub_str子串 while ((*p == *q)&&*p&&*q) { p++; q++; } //如果sub_str扫描到\0说明在str中找到子串,返回str中的子串首字符的起始地址 if (*q == '\0') { return str; } str++; } return NULL;}
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月01日 01时21分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
hdu-1211 Complete the Sequence
2019-03-04
属性闭包求解算法——数据库考试复习
2019-03-04
中缀表达式转后缀表达式
2019-03-04
砍树问题(二分法)
2019-03-04
poj3260The Fewest Coins
2019-03-04
poj3617
2019-03-04
poj3069
2019-03-04
Day160.MySql优化的前置知识简介、Linux 安装 -MySql高级
2019-03-04
Java洛谷P5461 赦免战俘讲解
2019-03-04
关于 form表单 嵌套问题的解决方案
2019-03-04
论转发与重定向参数传递问题(jsp+servlet项目开发遇到的问题)
2019-03-04
Spring Boot怎么样处理静态资源(静态资源映射规则)_Web开发
2019-03-04
Android—— log.e(),log.d(),log.i()等的区别
2019-03-04
js中时间戳转时间格式
2019-03-04
JS中的数据类型
2019-03-04
位运算
2019-03-04
MarkDown
2019-03-04
线性代数 16 向量空间
2019-03-04