C++中strstr函数的实现方法总结

C++中strstr函数的实现方法总结

函数说明:

包含文件:string.h

函数名: strstr

函数原型:extern char *strstr(char *str1, char *str2);

功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null。

返回值:返回该位置的指针,如找不到,返回空指针。

方法一:

#include <iostream>
#include <assert.h>
using namespace std; 

char* My_strstr(char *src,char *substr)
{
  assert(src != NULL && substr != NULL); 

  unsigned int size = strlen(src);
  for(int i = 0; i < size; ++i,++src)
  {
    char *p = src;
    for(char *q = substr;;p++,q++)
    {
      if(*q == '\0')  //在src中找到连续的substr子串停止并返回
      {
        return src;
      }
      if(*q != *p)
      {
        break;
      }
    }
  } 

  return NULL;
} 

int main()
{
  char *res = My_strstr("abcdefg","cde");
  if(res != NULL)
  {
    cout<<"exist:"<<res<<endl;
  }
  else
  {
    cout<<"no exist!"<<endl;
  }
  return 0;
}

方法二:

#include <iostream>
#include <assert.h>
using namespace std;
char* My_strstr(const char* s1,const char* s2)
{
  int n;
  if(*s2)
  {
    while(*s1)
    {
      for(n=0;*(s1+n)==*(s2+n);n++)
      {
        if(!*(s2+n+1))
          return (char*)s1;
      }
      s1++;
    }
    return NULL;
  }
  else
    return (char*)s1;
} 

int main()
{
  char *res = My_strstr("abcdefg","cde");
  if(res != NULL)
  {
    cout<<"exist:"<<res<<endl;
  }
  else
  {
    cout<<"no exist!"<<endl;
  }
  return 0;
}

方法三:

#include <iostream>
#include <assert.h>
using namespace std;
char* My_strstr(const char* s1,const char* s2)
{
  const char *p=s1;
  const size_t len=strlen(s2);
  for(;(p=strchr(p,*s2))!=0;p++)// strchr查找字符串s中首次出现字符c的位置
  {
    if(strncmp(p,s2,len)==0)
    {
      return(char*)p;
    }
  }
  return(0);
}
int main()
{
  char *res = My_strstr("abcdefg","cde");
  if(res != NULL)
  {
    cout<<"exist:"<<res<<endl;
  }
  else
  {
    cout<<"no exist!"<<endl;
  }
  return 0;
}

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • C++ 中boost::share_ptr智能指针的使用方法

    C++ 中boost::share_ptr智能指针的使用方法 最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论.当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述. 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中new了之后不用delete,智能指针自己会帮助你管理

  • C++中构造函数的参数缺省的详解

    C++中构造函数的参数缺省的详解 前言: 构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值.在构造函数中也可以采用这样的方法来实现初始化. #include <iostream> using namespace std; class A { public : A(int aa=0,int bb=00); //在声明构造函数时指定默认参数 int volume( ); int a; int b; }; int main( ) { A

  • C++计算图任意两点间的所有路径

    基于连通图,邻接矩阵实现的图,非递归实现. 算法思想: 设置两个标志位,①该顶点是否入栈,②与该顶点相邻的顶点是否已经访问. A 将始点标志位①置1,将其入栈 B 查看栈顶节点V在图中,有没有可以到达.且没有入栈.且没有从这个节点V出发访问过的节点 C 如果有,则将找到的这个节点入栈,这个顶点的标志位①置1,V的对应的此顶点的标志位②置1 D 如果没有,V出栈,并且将与v相邻的全部结点设为未访问,即全部的标志位②置0 E 当栈顶元素为终点时,设置终点没有被访问过,即①置0,打印栈中元素,弹出栈顶

  • C++ 中构造函数的实例详解

    C++ 中构造函数的实例详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助. 1. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回类型 Counter() { m_value = 0; } private: // 数据成员 int m_va

  • C++ 中Vector常用基本操作

    标准库vector类型是C++中使用较多的一种类模板,vector类型相当于一种动态的容器,在vector中主要有一些基本的操作,下面通过本文给大家介绍,具体内容如下所示: (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的. (5)使用迭代器访问元素. vect

  • C++中strstr函数的实现方法总结

    C++中strstr函数的实现方法总结 函数说明: 包含文件:string.h 函数名: strstr 函数原型:extern char *strstr(char *str1, char *str2); 功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2位置起,返回str1的指针,如果没有,返回null. 返回值:返回该位置的指针,如找不到,返回空指针. 方法一: #include <iostream> #include <assert.h> usi

  • oracle中decode函数的使用方法示例

    decode的几种用法 1:使用decode判断字符串是否一样 DECODE(value,if1,then1,if2,then2,if3,then3,...,else) 含义为 IF 条件=值1 THEN RETURN(value 1) ELSIF 条件=值2 THEN RETURN(value 2) ...... ELSIF 条件=值n THEN RETURN(value 3) ELSE RETURN(default) END IF sql测试 select empno,decode(empn

  • ThinkPHP自动完成中使用函数与回调方法实例

    本文实例讲述了ThinkPHP自动完成中使用函数与回调方法.分享给大家供大家参考.具体方法如下: ThinkPHP 自动填充格式如下: 复制代码 代码如下: array(填充字段,填充内容[,填充条件][,附加规则]) 附加规则,可选,包括: string:字符串,表示填充内容为字符串(默认). function:使用函数,表示填充的内容是一个函数返回值. callback:使用方法,表示填充的内容是一个当前 Model 的方法返回值. field:字段,表示填充的内容是一个其他字段的值. Th

  • php实现excel中rank函数功能的方法

    本文实例讲述了php实现excel中rank函数功能的方法.分享给大家供大家参考.具体分析如下: sql语句实现排名是像这样的如: 总分成绩为 195,180,180,161,名次分别为1,2,3,4,遇到并列的情况也是按照顺序的, 而Excel函数rank排名得到的结果是1,2,2,4,遇到并列跳过中间的3 下面的函数模拟的就是这种情况 函数如下(不知道有没有更好的实现方法): 公式为: 名次=总人数--比自己小的数的个数-这个分数重复次数+1(加上自己) 得到名次的数组再根据对应的id写入到

  • 浅谈MySQL中group_concat()函数的排序方法

    group_concat()函数的参数是可以直接使用order by排序的.666.. 下面通过例子来说明,首先看下面的t1表. 比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要从高到底排序. 可以这样写: SELECT username,GROUP_CONCAT(score ORDER BY score DESC) AS myScore FROM t1 GROUP BY username; 效果如下: 以上这篇浅谈MySQL中group_concat()函数的排序方法就

  • php中array_column函数简单实现方法

    本文实例讲述了php中array_column函数简单实现方法.分享给大家供大家参考,具体如下: php中的array_column()可返回输入数组中某个单一列的值. 示例: <?php // 从数据库中返回数组: $a = array( array( 'id' => 0015, 'age' => '20', 'name' => 'Tom', ), array( 'id' => 0016, 'age' => '21', 'name' => 'Jack', ),

  • PHP中error_log()函数的使用方法

    本文实例讲述了PHP中error_log()函数的使用方法.分享给大家供大家参考.具体分析如下: 今天遇到一个问题需要调试,但是只能通过日志打印调试,就用到了error_log这个函数 需要打印的是一台服务器发送到我们服务器的post数据 代码如下:(key和value都打印了) 复制代码 代码如下: if(!empty($_POST) ){  while (list($key, $val) = each($_POST))   {  @error_log("$key => $val&quo

  • 详解Django中 render() 函数的使用方法

    render() 函数 在讲 render() 函数之前,我们在 Django 项目 index 文件夹的 urls.py 和 views.py 中编写如下功能代码:(不难,望读者细心阅之) # index的 urls.py from django.urls import path form . import views urlpatterns = [ # 定义首页的路由 path(' ', views.index, name='index'), ] # index的views.py from

  • python中leastsq函数的使用方法

    leastsq作用:最小化一组方程的平方和. 参数设置: func 误差函数 x0 初始化的参数 args 其他的额外参数 举个例子: 首先创建样本点 import numpy as np import scipy as sp from scipy.optimize import leastsq import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode

  • C++的STL中accumulate函数的使用方法

    目录 1.累加求和 2.自定义数据类型的处理 3.用法 前言: accumulate定义在#include中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理 1.累加求和 int sum = accumulate(vec.begin() , vec.end() , 42); accumulate带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值.accumulate函数将它的一个内部变量设置为指定的初始值,然后在此初值上累加输入范围内所有元素的值.accumulat

随机推荐