关于C语言函数strstr()的分析以及实现

 更新时间:2013年07月11日 11:42:24   作者:  
以下是对C语言中strstr()函数的使用进行了详细的分析介绍,需要的朋友可以参考下
原型: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.
复制代码 代码如下:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning (disable:4996)
char *mystrstr(char *s1,char *s2);
int main(void)
{
 char *s="Golden Global View";
 char *l="ob";   //char *l=""
 char *p;
 system("cls");
 p=mystrstr(s,l);
 if (p!=NULL)
 {
  printf("%s\n",p);
 }
 else
 {
  printf("Not Found!\n");
 }
    getch();
 return 0;
}
/*FROM 百科*/
char *mystrstr(char *s1,char *s2)
{
 int n;
 if (*s2)                      //两种情况考虑
 {
        while(*s1)              
  {
            for (n=0;*(s1+n)==*(s2+n);n++)
            {
    if (!*(s2+n+1))            //查找的下一个字符是否为'\0'
    {
     return (char*)s1;
    }
            }
   s1++;
  }
  return NULL;
 }
 else
 {
  return (char*)s1;
 }
}

另一个实现:
复制代码 代码如下:

char *  strstr (buf, sub)
     register char *buf;
     register char *sub;
{
    register char *bp;
    register char *sp;
    if (!*sub)
      return buf;
    while (*buf)
    {
        bp = buf;
        sp = sub;
        do {
            if (!*sp)
              return buf;
        } while (*bp++ == *sp++);
        buf += 1;
    }
    return 0;
}

又一个实现:
复制代码 代码如下:

#include <iostream>
#include <string>
using namespace std;
//c语言实现strstr
const char* isSub(const char* str, const char *subs){
 //特殊情况
 if(!*subs)
  return str;
 const char* tmp=str;
 while (*tmp!='\0')
 {
  //用于每次将父串向后移动一个字符
  const char* tmp1=tmp;
  //记录子串地址
  const char* sub1=subs;
  while (*sub1!='\0'&&*tmp1!='\0')
  {
   //若不相等则跳出,将父串后移一个字符
   if (*sub1!=*tmp1)
    break;
   //若相等且子串下一个字符是末尾则是这个父串的子串
   if (*sub1==*tmp1&&*(sub1+1)=='\0')
    return tmp;
   //若相等则继续比较下一个字符
   if (*sub1==*tmp1)
   {
    sub1++;
    tmp1++;
   }
  }
  tmp++;
 }
 return NULL;
}
int main(){
 char* str1="ababcdddb";
 char* str="";
 const char *res=isSub(str1,str);
 if (res!=NULL)
 {
  cout << res << endl;
 }
 else
  cout << "null" << endl;
 //cout << isSub(str1,str) << endl;
 return 0;
}

相关文章

  • C语言详解无头单向非循环链表各种操作方法

    C语言详解无头单向非循环链表各种操作方法

    无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多
    2022-04-04
  • C++使用waveIn实现声音采集

    C++使用waveIn实现声音采集

    在Windows上实现录音比较简单的方法是使用winmm,其中的waveIn模块就可以打开录音设备,这篇文章主要为大家介绍了C++如何使用waveIn实现声音采集,需要的可以了解下
    2023-10-10
  • C++数据结构继承的概念与菱形继承及虚拟继承和组合

    C++数据结构继承的概念与菱形继承及虚拟继承和组合

    今天我要给大家介绍C++中更深入的内容了。C++这门语言为了使代码不冗余,做了些什么操作呢?C++的继承就很好地实现了类层次的代码复用,今天我就要来和大家好好聊一聊它了
    2022-02-02
  • Qt 自定义属性Q_PROPERTY不显示float类型的解决

    Qt 自定义属性Q_PROPERTY不显示float类型的解决

    这篇文章主要介绍了Qt 自定义属性Q_PROPERTY不显示float类型的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 用C语言进行最基本的socket编程

    用C语言进行最基本的socket编程

    这篇文章主要介绍了C语言下socket编程的基本知识讲解,包括最基本的客户端发送及服务器端接受数据的实现,需要的朋友可以参考下
    2015-11-11
  • Visual Studio新建类从默认internal改为public

    Visual Studio新建类从默认internal改为public

    本文将介绍如何将Visual Studio中的internal修饰符更改为public,以实现更广泛的访问和重用,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C++内存泄漏及检测工具详解

    C++内存泄漏及检测工具详解

    最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控
    2013-10-10
  • C语言结构体(struct)的详细讲解

    C语言结构体(struct)的详细讲解

    C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型),下面这篇文章主要给大家介绍了关于C语言结构体(struct)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • 简单总结C语言中各种类型的指针的概念

    简单总结C语言中各种类型的指针的概念

    这篇文章主要简单总结了C语言中各种类型的指针的概念,指针可以说是C语言本身所具有的最大特性,平时根据不同使用场合习惯地将其简单分类,需要的朋友可以参考下
    2016-03-03
  • C实现与 uint64_t 相同功能的类

    C实现与 uint64_t 相同功能的类

    本文给大家分享的是笔者实现的仿uint64_t的类,可以用在不支持uint64_t的平台上,虽然现在功能还不完善,但是还是分享给大家,也算是给大家一个思路吧。
    2015-12-12

最新评论