使用C语言解决字符串匹配问题的方法
最常想到的方法是使用KMP字符串匹配算法: #include <stdio.h> #include <stdlib.h> #include <string.h> int get_nextval(char *pattern,int next[]) { //get the next value of the pattern int i = 0,j = -1; next[0] = -1; int patlen = strlen(pattern); while ( i < patlen - 1){ if ( j == -1 || pattern[i] == pattern[j]){ ++i; ++j; if (pattern[i] != pattern[j]) next[i] = j; else next[i] = next[j]; } else j = next[j]; } return(0); } int kmpindex(char *target,char *pattern,int pos) { int tari = pos,pati = 0; int tarlen = strlen(target),patlen = strlen(pattern); int *next = (int *)malloc(patlen * sizeof(int)); get_nextval(pattern,next); while ( tari < tarlen && pati < patlen ){ if (pati == -1 ||target[tari] == pattern[pati]){ ++tari; ++pati; }else{ pati = next[pati]; } } if(next != NULL) free(next); next = NULL; if (pati == patlen) return tari - pati; else return -1; } int main() { char target[50],pattern[50]; printf("imput the target:n" ); scanf("%s",target); printf("imput the pattern:n" ); scanf("%s",pattern); int ans = kmpindex(target,pattern,0); if (ans == -1) printf("errorn"); else printf("index:%dn",ans); return 0; }
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 1001 #define LEN 101 struct str { char name[101]; }; int main() { struct str strs[MAX]; struct str t[LEN]; int i,n,len,j,k,left,right,count,flag; char text[LEN],newtext[LEN]; while (scanf("%d",&n) != EOF) { // 接收数据 getchar(); for (i = 0; i < n; i ++) { scanf("%s",strs[i].name); } // 接收文本串 getchar(); gets(text); len = strlen(text); for (i = left = right = 0; i < len; i ++) { if (text[i] == '[') { left = i; } else if (text[i] == ']') { right = i; break; } } count = right - left - 1; if (count <= 0) { // 没有正则匹配 for (i = j = 0; i < len; i ++) { if (text[i] != '[' && text[i] != ']') { newtext[j ++] = text[i]; } } newtext[j] = ' '; for (i = 0; i < n; i ++) { if (strcasecmp(strs[i].name,newtext) == 0) { printf("%d %sn",i + 1,strs[i].name); } } }else { // 需要正则匹配 for (j = 1,k = 0; j <= count; j ++,k ++) { // 构建文本数组 memset(t[k].name,' ',sizeof(t[k].name)); for (i = 0; i < left; i ++) { t[k].name[i] = text[i]; } t[k].name[i] = text[left + j]; strcat(t[k].name,text + right + 1); } // 正则匹配 for (i = 0; i < n; i ++) { for (j = flag = 0; j < count; j ++) { if (strcasecmp(strs[i].name,t[j].name) == 0) { flag = 1; break; } } if (flag) { printf("%d %sn",strs[i].name); } } } } return 0; } /************************************************************** (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |