普通的字符串匹配函数:

// KMP.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//求字串位置的定位函数
char *s="acabaabaabcacaabc";
char *p="abaabcac";
int lenS;
int lenP;
int Index(char *s,char *p,int pos){
    int i=pos;
    int j=0;
    while(i<lenS&&j<lenP){
        if(s[i]==p[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;j=0;
        }

    }
    if(j=lenP) return i-lenP;
    else
        return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    lenS=strlen(s);//目标串长度
    lenP=strlen(p);//字串长度
    int index=Index(s,p,0);
    printf("%d\n",index);
    return 0;
}

基本思想:如果匹配成功,则目标串和字串同时向后移动一位,否则,目标串从当前位置向后移动一位,字串则移动到开始位置进行重新匹配。

KMP算法:

其中比较重要的过程就是计算next函数

参考文献:http://www.cnblogs.com/zhizhizhiyuan/p/3508052.html

// KMP.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//求字串位置的定位函数
char *s="acabaabaabcacaabc";
char *p="abaabcac";
int lenS;
int lenP;
int Index(char *s,char *p,int pos){
    int i=pos;
    int j=0;
    while(i<lenS&&j<lenP){
        if(s[i]==p[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;j=0;
        }

    }
    if(j=lenP) return i-lenP;
    else
        return 0;
}
int  *next;
//计算前缀函数
void getNext(char *p,int  * &next){
    int i=0;
    next[0]=-1;
    int j=-1;
    while(p[i]!='\0'){
        if(j==-1||p[i]==p[j])
        {
            i++;
            j++;
            if(p[i]!=p[j])
                next[i]=j;
            else
                next[i]=next[j];
        }
        else
            j=next[j];
    }
}
//使用kmp的编程实现
int Index_KMP(char *s,char *p,int pos){
    int i=pos;
    int j=0;
    while(i<lenS&&j<lenP)
    {
        if(j==0||s[i]==p[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }
    if(j==lenP)
        return i-lenP;
    else
        return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    lenS=strlen(s);//目标串长度
    lenP=strlen(p);//字串长度
    //int index=Index(s,p,0);
    next=(int *)malloc(sizeof(int)*lenP);
    getNext(p,next);
    //for(int i=0;i<lenP;i++)
       // printf("%d ",next[i]);
    int index=Index_KMP(s,p,0);
    
    printf("%d\n",index);
    return 0;
}

所有代码已经调试通过!