某些库函数的模拟实现(一)
2016-04-13 22:30
381 查看
模拟实现以下函数:strcpy()函数~strcat()函数~strstr()函数~strlen()函数
1.strcpy()函数模拟
(2).第二个参数用const来修饰~防止复制过程中两个串写反而在编译过程中检查不出来~
(3)有返回值~
2.strcat()函数模拟:
两个函数比较相似~都需要注意到的是,不管是复制还是连接,在之前,都需要将dest串保存起来,防指最后指向结束符字符串无法输出~3.strlen()函数模拟:
4.strstr()模拟实现
分析:strstr函数的功能是找到原串中是否可以找到子串,如果可以,返回从子串开始地方的指针~
1.strcpy()函数模拟
#include<assert.h> char * my_strcpy(char *dest, const char *src) { char *ret = dest; assert(dest); assert(src); while (*dest++ = *src++) { ; } return ret; }需要注意的地方:(1).记着复制\0
(2).第二个参数用const来修饰~防止复制过程中两个串写反而在编译过程中检查不出来~
(3)有返回值~
2.strcat()函数模拟:
<pre name="code" class="objc">char *my_strcat(char *dest, const char *src) { char *ret = dest; assert(dest); assert(src); while (*dest) { ++dest; } while (*dest++ = *src++) { ; } return ret; }
两个函数比较相似~都需要注意到的是,不管是复制还是连接,在之前,都需要将dest串保存起来,防指最后指向结束符字符串无法输出~3.strlen()函数模拟:
int my_strlen(const char *str) { if (*str != '\0') return 1 + my_strlen(str+1); else return 0; }由于非递归实现比较简单,这里就不给出代码~~
4.strstr()模拟实现
<pre name="code" class="objc">char *mathed(const char *str, const char *substr) { const char *str1 = str; const char *str2 = substr; const char *start = NULL; assert(str); assert(substr); while (*str1 != '\0') { start = str1; while (*str1 && *str2) { if (*str1 == *str2) { str1++; str2++; } else break; } /*while (*str1 && *str2 && *str1 == *str2) { str1++; str2++; }*/ if (*str2 == '\0') { return (char *)start; } str1 = start + 1; str2 = substr; } return NULL; } int main() { char *str = NULL; str = mathed("abcdde","bbcd"); if (str != NULL) { printf("%s", str); } else { printf("match fail"); } system("pause"); return 0; }
分析:strstr函数的功能是找到原串中是否可以找到子串,如果可以,返回从子串开始地方的指针~
这个就有点类似kmp算法,当原串和子串的字符相等 ,两串分别向后移动一,若子串指向结束符,说明找到了,如果子串没有指向结束符,并且指针所指向字符不等,此时子串指向开始地方,原串指向上次开始地方的下一个位置~当原串指向结束符,说明找不到了~~
屏蔽的while循环和与它最近的while循环等价,屏蔽的while结构更清晰,未屏蔽的,则需要注意if和else配套使用,不然会出现意想不到的结果~
相关文章推荐
- 如何使用CSS实现小三角形效果
- linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍
- TCP/IP篇--各协议简介
- Android自学之百度地图API使用遇到的一些问题
- 神经网络入门基础知识 neural networks basics
- java实例化的理解
- swift 中使用扩展实现代理,让程序猿省心,让代码简洁
- 如何根据wsdl文件生成客户端
- 获取手机通讯录联系人
- poj-2105-IP Address
- 数据结构学习笔记(七)--图
- 二叉树面试总结
- 刚挣钱的程序员同学该如何花钱?
- 用友元函数设计点类求两点之间的距离
- 递归函数实例
- 自制音乐播放器
- js获取浏览器基本信息:document.body.clientWidth/clientHeight/scrollWidth/scrollTop。
- STL与泛型编程-学习2-GeekBand
- POJ_2186_Popular Cows
- AMS安装