C语言中的strstr函数
转自: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函数的更多相关文章
- c语言中的rewind函数,Win CE 不支持,可用fseek函数替换
FILE *read = fopen(cXmlFile,"rb"); if (read) { fseek(read, 0L, SEEK_END); int len = ftell( ...
- c语言中的malloc函数
少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...
- C语言中的system函数参数及其作用
函数名: system 功 能: 发出一个DOS命令 用 法: int system(char *command); system函数已经被收录在标准c库中,可以直接调用 system() ...
- c语言中的fgets函数
fgets()函数用于从文件流中读取一行或指定个数的字符,其原型为: char * fgets(char * string, int size, FILE * stream); 参数说明:string ...
- linux下C语言中的flock函数用法 【转】
表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依参数operation所指 ...
- C语言中的memset函数和数组指针
代码: #include <iostream> #include <cstring> using namespace std; int main(){ ] = {}; mems ...
- C语言中的system函数參数具体解释
http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功 能: 发出一个DOS命令 用 法: int sy ...
- linux下C语言中的flock函数使用方法 .
表头文件 #include<sys/file.h> 定义函数 int flock(int fd,int operation); 函数说明 flock()会依參数operation所指 ...
- C语言中的sizeof函数总结
sizeof函数的结果: 变量:变量所占的字节数. ; printf( 数组:数组所占的字节数. ,,,,}; ] = {,,,,}; printf("size_arr1=%d\n" ...
随机推荐
- 大数据入门第七天——MapReduce详解(一)入门与简单示例
一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...
- 【转载】COM 组件设计与应用(七)——编译、注册、调用
原文:http://vckbase.com/index.php/wv/1218.html 一.前言 上两回中,咱们用 ATL 写了第一个 COM 组件程序,这回中,主要介绍编译.册和调用方法.示例程序 ...
- opencv-Drawing Functions in OpenCV
1.opencv简单画图形 # coding = utf-8 # 画线.长方形.圆等 import numpy as np import cv2 # 返回一个数组 img = np.zeros((51 ...
- Kafka系列一 基本安装
一 配置文件(下载.解压.跳过) # Licensed to the Apache Software Foundation (ASF) under one or more # contributor ...
- 为什么Python类成员的调用和声明必须有"this"?
Python的这种设计是作者从Modula-3中借鉴来的,在后面使用的情况看来,这个设计也是比较成功的.我们对比Python和C++讨论一下这个问题: Modula-3是上世纪80年代末数字设备公司( ...
- 第一次玩github,第一个开源小项目——xxoo
引言 由于最近的工作写代码比较少,这让LZ产生了一丝危机感.于是便想找一个办法可以没事自己写写代码,自然而然就想到了github.接下来便是一阵捣鼓的过程,其实整个过程很快,主要过程就是注册一个账号, ...
- 记一个小bug的锅
人生中的第一个线上bug 我参与的第一个项目就出现了.但是自己还觉得这锅也不全是自己的,毕竟那么明显的bug出现在历史模块中(不是我写的新模块),难道测试部就没一点责任?代码走查人员就没一点责任?不过 ...
- 利用for循环如何判定是水仙花数
水仙花数业内的大家可能听说过,但是对于初学者来讲,对于水仙花数还是比较陌生的. 首先要知道的是水仙花数的计算公式:153=1**3+5**3+3**3: 如何去判定这个数是否为水仙花数,最好的办法就是 ...
- cpp-variable-lifetime
#include <cstdio> #include <iostream> using namespace std; class TmpClass; void FuncScop ...
- Python构建web应用(进阶版)->对网页HTML优化逻辑显示
本篇是承接上一篇web应用(入门级)的内容往下顺延的,阅读后将会了解HTML逻辑显示优化,如下图所示,从杂乱无章的日志文件到一个整齐的列表显示. —————————————————————————— ...