转自:http://www.cnblogs.com/xy-kidult/archive/2012/12/25/2832460.html

早上翻《C和指针》,碰见一个子串查找问题,这个问题在C标准库中有模板,即strstr函数,其原型是char*strstr(const char*s1,const char* s2);

  这个函数的作用是在s1中查找子串s2,如果找到,则返回s1中s2的位置。否则返回NULL。

  虽说函数库中存在解决方案,但还是想亲自动手实践一下。于是开始编程,思路很简单,分两步,第一,判断s2是不是空的,或者s2的长度是不是小于s1的长度;第二,在s1中遍历查找与s2第一个字符匹配的字母,如找到,则进行下一个字符匹配。如找不到,则返回空指针。

  结果却都失败了。每次都碰见内存报错问题。仔细检查也没找到错误原因。

  在网上百度了一个答案(见附录),才明白这其实涉及了一个字符匹配算法问题。而我的代码明显想简单了,所以没有成功。字符匹配算法中最常用的是KMP,这个算法说来话长,先挖个坑吧,以后有空再来好好研究它。

 1 #include <stdio.h>
2 #include<string.h>
3
4 char * strrstr(char const *s1,char const *s2){
5 char *p2s1=(char*)s1;
6 char *p2s2=(char*)s2;
7
8 int i,j,m,n,k;
9 i=k=0;
10 j=0;
11 while(i<strlen(s1)&&j<strlen(s2))
12 {
13 if(*(p2s1+i)==*(p2s2+j))
14 {
15 i++;
16 j++;
17 }
18 else
19 {
20 j=0;k++;
21 i=k;//可用于记录原来i的位置 ;
22
23
24 }
25 }
26
27 if(j>=strlen(s2))//判断找到字符串的条件
28 {
29 printf("找到字符串%s",s2);
30 return (p2s1+i);
31 }
32 else
33 {
34 printf("未找到字符串%s\n",s2);
35 return NULL;
36 }
37
38
39 }
40 int main()
41 {
42 char a[]="abcdefghijkl";
43 char b[]="fgi";
44
45 char* c;
46 c=strrstr(a,b);
47
48
49 return 0;
50
51
52 }

C语言中的strstr函数的更多相关文章

  1. c语言中的rewind函数,Win CE 不支持,可用fseek函数替换

    FILE *read = fopen(cXmlFile,"rb"); if (read) { fseek(read, 0L, SEEK_END); int len = ftell( ...

  2. c语言中的malloc函数

    少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...

  3. C语言中的system函数参数及其作用

    函数名: system 功   能: 发出一个DOS命令  用   法: int system(char *command);  system函数已经被收录在标准c库中,可以直接调用 system() ...

  4. c语言中的fgets函数

    fgets()函数用于从文件流中读取一行或指定个数的字符,其原型为: char * fgets(char * string, int size, FILE * stream); 参数说明:string ...

  5. linux下C语言中的flock函数用法 【转】

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依参数operation所指 ...

  6. C语言中的memset函数和数组指针

    代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...

  7. C语言中的system函数參数具体解释

    http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令   用   法: int sy ...

  8. linux下C语言中的flock函数使用方法 .

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依參数operation所指 ...

  9. C语言中的sizeof函数总结

    sizeof函数的结果: 变量:变量所占的字节数. ; printf( 数组:数组所占的字节数. ,,,,}; ] = {,,,,}; printf("size_arr1=%d\n" ...

随机推荐

  1. webBrowser.Document.Cookie取不到HttpOnly的Cookie,取Cookie不完整

    在做数据采集时,有些网站需要输入验证码,但各网站验证码都不同,不可能有完美的识别验证码的代码,所以我也没去研究,我所采取的方案是:在winform里通过WebBrowser调用网页先手动登录系统,然后 ...

  2. RabbitMQ(一):Window安装RabbitMQ

    原文:RabbitMQ(一):Window安装RabbitMQ 1.安装ERLANG语言环境 由于RabbitMQ是采用Erlang编写的,因此我们需要先安装该语言库,以便运行代理服务器.从Erlan ...

  3. JavaEE笔记(九)

    List.Map.Set的配置 bean package com.spring.bean; import java.util.List; import java.util.Map; import ja ...

  4. 查内存命令之free

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  5. Noip前的大抱佛脚----文章索引

    Noip前的大抱佛脚----赛前任务 Noip前的大抱佛脚----考场配置 Noip前的大抱佛脚----数论 Noip前的大抱佛脚----图论 Noip前的大抱佛脚----动态规划 Noip前的大抱佛 ...

  6. 一步步实现一个基本的缓存模块·续, 添加Memcached调用实现

    jusfr 原创,转载请注明来自博客园. 在之前的实现中,我们初步实现了一个缓存模块:包含一个基于Http请求的缓存实现,一个基于HttpRuntime.Cache进程级的缓存实现,但观察代码,会发现 ...

  7. 随机游走模型(RandomWalk Mobility)

    随机游走模型由首先由爱因斯坦在1926年以数学方式描述.由于自然界中的许多实体会以不可预知的方式移动,因此随机游走模型用来描述这种不稳定的移动.在这种移动模型中,移动节点随机选择一个方向和速度来从当前 ...

  8. vue组件--TagsInput

    简介 TagsInput 是一种可编辑的输入框,通过回车或者分号来分割每个标签,用回退键删除上一个标签.用 vue 来实现还是比较简单的. 先看效果图,下面会一步一步实现他. 注:以下代码需要vue- ...

  9. oracle数据库数据字典应用

    oracle数据字典 数据字典是由oracle服务器创建和维护的一组只读的系统表.数据字典分为两类:一是基表,二是数据字典视图. 数据字典视图包括用户名.用户权限.对象名.约束和审计等信息,是通过运行 ...

  10. Set up classpath in Eclipse

    On Eclipse main window Right click on .java file-> Run As -> Run Configurations... On Run Conf ...