原型:char *strstr(const char *str1, const char *str2);

#include<string.h>

找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。返回该位置的指针,如找不到,返回空指针。

Returns a pointer to the first occurrence of strSearch in str, or NULL if strSearch does not appear in str. IfstrSearch points to a string of zero length, the function returns str.

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #pragma warning (disable:4996)
  6. char *mystrstr(char *s1,char *s2);
  7. int main(void)
  8. {
  9. char *s="Golden Global View";
  10. char *l="ob"; //char *l=""
  11. char *p;
  12. system("cls");
  13. p=mystrstr(s,l);
  14. if (p!=NULL)
  15. {
  16. printf("%s\n",p);
  17. }
  18. else
  19. {
  20. printf("Not Found!\n");
  21. }
  22. getch();
  23. return 0;
  24. }
  25. /*FROM 百科*/
  26. char *mystrstr(char *s1,char *s2)
  27. {
  28. int n;
  29. if (*s2) //两种情况考虑
  30. {
  31. while(*s1)
  32. {
  33. for (n=0;*(s1+n)==*(s2+n);n++)
  34. {
  35. if (!*(s2+n+1)) //查找的下一个字符是否为'\0'
  36. {
  37. return (char*)s1;
  38. }
  39. }
  40. s1++;
  41. }
  42. return NULL;
  43. }
  44. else
  45. {
  46. return (char*)s1;
  47. }
  48. }

另一个实现:

  1. char * strstr (buf, sub)
  2. register char *buf;
  3. register char *sub;
  4. {
  5. register char *bp;
  6. register char *sp;
  7.  
  8. if (!*sub)
  9. return buf;
  10. while (*buf)
  11. {
  12. bp = buf;
  13. sp = sub;
  14. do {
  15. if (!*sp)
  16. return buf;
  17. } while (*bp++ == *sp++);
  18. buf += 1;
  19. }
  20. return 0;
  21. }

又一个实现:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. //c语言实现strstr
  5.  
  6. const char* isSub(const char* str, const char *subs){
  7. //特殊情况
  8. if(!*subs)
  9. return str;
  10.  
  11. const char* tmp=str;
  12. while (*tmp!='\0')
  13. {
  14. //用于每次将父串向后移动一个字符
  15. const char* tmp1=tmp;
  16. //记录子串地址
  17. const char* sub1=subs;
  18.  
  19. while (*sub1!='\0'&&*tmp1!='\0')
  20. {
  21. //若不相等则跳出,将父串后移一个字符
  22. if (*sub1!=*tmp1)
  23. break;
  24. //若相等且子串下一个字符是末尾则是这个父串的子串
  25. if (*sub1==*tmp1&&*(sub1+1)=='\0')
  26. return tmp;
  27. //若相等则继续比较下一个字符
  28. if (*sub1==*tmp1)
  29. {
  30. sub1++;
  31. tmp1++;
  32. }
  33. }
  34. tmp++;
  35. }
  36. return NULL;
  37. }
  38.  
  39. int main(){
  40. char* str1="ababcdddb";
  41. char* str="";
  42. const char *res=isSub(str1,str);
  43. if (res!=NULL)
  44. {
  45. cout << res << endl;
  46. }
  47. else
  48. cout << "null" << endl;
  49. //cout << isSub(str1,str) << endl;
  50.  
  51. return 0;
  52. }

C语言函数strstr()分析及实现的更多相关文章

  1. C语言函数strstr

    函数原型: extern char *strstr(char *str1, const char *str2);   语法: * strstr(str1,str2)   参数: str1: 被查找目标 ...

  2. 最最简单的c语言函数汇编分析

    0x01 环境 xp+vc6.0 0x02 代码 int plus(int x, int y) { return 0; } 以下是vc6.0的反汇编窗口 1: int plus(int x, int ...

  3. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  4. C语言函数库

    C语言函数库 分类函数目录函数进程函数诊断函数接口子程序输入输出 str字符串操作函数mem操作存贮数组 数学函数 时间日期函数 转换函数 分类函数,所在函数库为ctype.h[top] int is ...

  5. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  6. 03-第一个C语言程序的分析

    本文目录 一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语 ...

  7. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  8. 动态修改 C 语言函数的实现

    Objective-C 作为基于 Runtime 的语言,它有非常强大的动态特性,可以在运行期间自省.进行方法调剂.为类增加属性.修改消息转发链路,在代码运行期间通过 Runtime 几乎可以修改 O ...

  9. 利用R语言打造量化分析平台

    利用R语言打造量化分析平台 具体利用quantmod包实现对股票的量化分析 1.#1.API读取在线行情2.#加载quantmod包3.if(!require(quantmod)){4. instal ...

随机推荐

  1. Android Studio: You need to use a Theme.AppCompat theme (or descendant) with this activity.

    错误描述为: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with ...

  2. 用Netty解析Redis网络协议

    用Netty解析Redis网络协议 根据Redis官方文档的介绍,学习了一下Redis网络通信协议.然后偶然在GitHub上发现了个用Netty实现的Redis服务器,很有趣,于是就动手实现了一下! ...

  3. dubbo安装

    dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,分享牛系列,分享牛专栏,分享牛.但管控台是否正常对 Dubbo 服务没有影响,管控台也不需要高可用,因此可以单节 ...

  4. 将meteor部署到自己的服务器(deploy meteor to your own server)

    安装指定版本的node # 所有版本在:https://nodejs.org/download/release/# current dir:/rootwget -c https://nodejs.or ...

  5. cassandra eclipse 环境构建

    摘要 本文主要介绍如何在eclipse中搭建cassandra环境 更多cassandra,nosql 相关知识请访问http://www.webpersonaldeveloper.cn 正文 1.f ...

  6. JAVA面向对象-----super关键字

    JAVA面向对象-–super关键字 1:定义Father(父类)类 1:成员变量int x=1; 2:构造方法无参的和有参的,有输出语句 2:定义Son类extends Father类 1:成员变量 ...

  7. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  8. 【Netty源码学习】BootStrap

    BootStrap是客户端的启动类,其主要功能就是设置必要的参数然后启动客户端. 实现如下: Bootstrap b = new Bootstrap(); b.group(group) .channe ...

  9. Python模块探秘 Smtplib发送带有各种附件的邮件

    这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...

  10. 安卓仿QQ红包领取详情界面动画

    为了能清楚的看到这个效果,本人不惜几次花费重金给众群叼发放红包,来查看红包领取详情界面的动画效果,QQ效果如图: 图中我们可以看到,动画处的头像和文字是一起的,即同时并且是整体,注意,是整体进行缩放的 ...