I wrote this code and it works in some cases. Sometimes, however, this fails, and I just don't understand why. Can someone please help me identify the error?
It works for: String: ishanthakkar ishan patter: ishan
But this fails for:
String: cpr ograming patter: cpr
A source:
#include <stdio.h> #include <stdlib.h> #include <string.h> int *compute_prefix_function(char *pattern, int psize) { int k = -1; int i = 1; int *pi = malloc(sizeof(int)*psize); if (!pi) return NULL; pi[0] = k; for (i = 1; i < psize; i++) { while (k > -1 && pattern[k+1] != pattern[i]) k = pi[k]; if (pattern[i] == pattern[k+1]) k++; pi[i] = k; } return pi; }
// This function finds the matching string at O (n) time, so repeat it through the text string only once when the unmatching character is detected; it goes with the next character and starts comparing with the first character of the string to be searched, i.e. pattern
int kmp(char *target, int tsize, char *pattern, int psize) { int i; int *pi = compute_prefix_function(pattern, psize); int k = -1; if (!pi) return -1; for (i = 0; i < tsize; i++) { while (k > -1 && pattern[k+1] != target[i]) k = pi[k]; if (target[i] == pattern[k+1]) k++; if (k == psize - 1) { free(pi); return ik; } } free(pi); return -1; } int main(int argc, const char *argv[]) { char target[200]; char *ch = target; char pattern[20]; int i; printf("Enter the string: \n"); fgets(target,100,stdin); printf("Enter the string to be matched: \n"); fgets(pattern,20,stdin); i = kmp(target, strlen(target), pattern, strlen(pattern)); if (i >= 0) printf("matched @: %s\n", ch + i); getch(); return 0; }
source share