/* ************************** * 字符串模式匹配 * KMP 算法实现 * * ***************************/ #include <string.h> #include <stdio.h> int KMP(const char *pDest,const char *pPattern); void GetNextArr(const char *pPattern, int *pNext,int nPatternLen); /* *************** * 测试函数 * 输入两个参数 * argv[1]:匹配的目标字符串 * arg[2]:需要匹配的字符串 * * ***************/ int main(int argc, char *argv[]) { int pos = 0; if(argc != 3) { printf("input error\n"); return -1; } pos = KMP(argv[1],argv[2]); printf("%d \n",pos); return 0; } /* ****************************** * 算法实现,如果匹配成功则返回位置(以1开始),匹配失败则返回-1 * pDest:匹配的目标字符串 * pPattern:需要匹配的字符串 * *******************************/ int KMP(const char *pDest,const char *pPattern) { int nDestPos = 0; int nPetternPos = 0; int nPatternLen = strlen(pPattern); int nDestLen = strlen(pDest); /*计算pNext数组*/ int *pNext = (int *)malloc(nPatternLen*sizeof(int)); GetNextArr(pPattern,pNext,nPatternLen); if(nPatternLen > nDestLen) { return -1; } while(nDestPos < nDestLen && nPetternPos < nPatternLen) { if(pDest[nDestPos] == pPattern[nPetternPos]) { nPetternPos++; nDestPos++; continue; } if (nPetternPos != 0) { nPetternPos = pNext[nPetternPos-1]; }else { nDestPos++; } } free(pNext); /*判断是否匹配成功,并返回结果*/ return (nPetternPos == nPatternLen)?(nDestPos - nPatternLen + 1):-1; } /*计算pNext数组 */ void GetNextArr(const char *pPattern, int *pNext,int nPatternLen) { int pos = 0; int j; pNext[0] = pNext[1] = 0; for(j = 1;j < nPatternLen; j++) { if(pos !=0 && pPattern[j] != pPattern[pos]) { pos = 0; } if(pPattern[j] == pPattern[pos]) { pos++; } pNext[j] = pos; } }