博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟实现strstr
阅读量:4116 次
发布时间:2019-05-25

本文共 1558 字,大约阅读时间需要 5 分钟。

函数原型是char*str(char *str1,char *str2);作用是找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符),如果找到,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回NULL.

举个例子:str1[32]="abcdedefg",str2[20]=def,通过函数str(str1,str2)可以得到“defg”.

那我们怎么才能模拟实现strstr函数呢?

首先的思路是创建两个指针char *p,char *q,而且返回函数定义为char *my_srtsrt(const char *dest,char *scr);分别让p,q指向

dest(str1传参)和scr(str2传参),通过指针来访问字符串。根据上面的例子,p指向a,q指向d,若是两个相等,则两个指针都向后移动一位,再解引用进行判断;若是两个不相等,那么向p后移动一位,q不动,两个再次进行比较。重复这个过程,直到两个字符串其中一个或者是两个都遇到‘\0‘(如果是q遇到‘\0’,则找到了;如果是p遇到‘\0’,则返回NULL)。

但是,如果定义char str1[32] = "abbbcdefg";char str2[10] = "bbcd"呢,结果是不是“bbcdefg”呢?

我们来看一下:当p指向a,q指向b,这时两个不相等,p继续向下执行;p指向b,这时*p=*q,pq指针同时移动;*p='b',*q='b',两个还相等,pq指针同时移动;*p='b',*q='c',两个不相等,p向后移动,而q不动(下次判断*q="bbcd"重新开始);然后*p='b',*q='b',两个相等,pq向后移动;*p='c',*q='b',两个不相等,p继续向下执行,而q不动;如此循环,我们发现没有找到字符串“bbcd”,结果返回NULL。

中间跳过了一个字符没有比较,所以,上面第一个思路是不可行的。

现在对上面的思路稍微修改一下:我们需要再定义一个指针变量char *np指向p,当*p!=*q时,让p指针返回到起始位置的下一个位置,然后再进行比较。下面我们来看一下具体程序:

#include
#include
#include
char *my_strstr( char* dest, char * src){ assert(dest); assert(src); char *p = NULL; char *np = NULL; char *q =NULL; p = dest; //当*p!='\0'时,循环一直成立 while (*p) { np = p; //np指向p; q = src; //q指向src; for (; (*np && *q) && (*np == *q); np++, q++) { ; } if (*q == '\0')//说明已经找到字符串“bbcd” { return p; } if (*np == '\0') { break; } p++;//可以得到原始位置的下一个位置; } return NULL;//not find}int main(){ char str1[32] = "abbbcdefg"; char str2[10] = "bbcd"; printf("%s\n", my_strstr(str1, str2)); system("pause"); return 0;}

运行后的结果就是“bbcdefg”.



转载地址:http://jmypi.baihongyu.com/

你可能感兴趣的文章
C语言-static和extern关键字1-对函数的作用
查看>>
C 语言-static和extern关键字2-对变量的作用
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
还不会正则表达式?看这篇!
查看>>
100道+ JavaScript 面试题,助你查漏补缺
查看>>
JavaScript深入理解之闭包
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
如何实现a===1 && a===2 && a===3返回true?
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
12 个JavaScript 特性技巧你可能从未使用过
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>