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" ...
随机推荐
- ACM1001:Sum Problem
Problem Description In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input ...
- IPC学习
课下作业-IPC 要求: 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 共享内存 共享内存可以说是最有用的进程间通信方 ...
- 仙人掌&圆方树
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...
- 使用cJSON库解析JSON
cJSON库的下载 cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要#include "cJS ...
- 菜鸟vimer成长记——第1章、统一概念
不管学什么技术,我都深信概念是最重要的.是影响整个学习轨迹,决定能在这个技术领域高度. 当然如果你现在的目的不是在学习而在于解决问题(很多人不愿意承认,或者没发现),那概念就暂时没那么重要了. 目的 ...
- 快速搭建属于自己的mongodb数据库
前言 MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写,支持Windows,Linux,OSX,Solaris等平台,默认端口为27017,是一个效率非常高的nosql数据库. 我的 ...
- vi/vim 常用命令 之 一图定天下!
直接上干活,一张图解决~
- VSCode中C/C++库文件的配置
VSCode中C/C++库文件的配置 之前一直在是用sublime做主要编辑器,现在主要使用VSCode,毕竟大厂制作,从目前的使用情况来看,我更喜欢使用VSCode编辑器. 有时候会用VScode来 ...
- docker 指令
杀死所有正在运行的容器docker kill $(docker ps -a -q) 删除所有已经停止的容器docker rm $(docker ps -a -q) 删除所有未打 dangling 标签 ...
- Altium中坐标的导出及利用坐标快速布局
器件的坐标其实在我们处理布局的时候,非常有用,例如A板布局导入B板. 1.在A板PCB中执行菜单命令“File-Assembly-Generates Pick and Place File”对器件的坐 ...