pmatch !
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
char string[MAX_SIZE];
char pat[MAX_SIZE];
char failure[MAX_SIZE];
int compare(char *string, char *pat)
{
int c, d, e, string_length, pat_length, position = -1;
string_length = strlen(string);
pat_length = strlen(pat);
if (pat_length > string_length)
{
return -1;
}
for (c = 0; c <= string_length - pat_length; c++)
{
position = e = c;
for (d = 0; d < pat_length; d++)
{
if (pat[d] == string[e])
{
e++;
}
else
{
break;
}
}
if (d == pat_length)
{
return position;
}
}
return -1;
}
int nfind(char *string, char *pat)
{
int i,j=0,start = 0;
int lasts = strlen(string) -1;
int lastp = strlen(pat) -1;
int endmatch = lastp;
for(i = 0; endmatch <=lasts; endmatch++,start++)
{
if(string[endmatch] == pat[lastp])
{
for(j=0, i= start; j< lastp && string[i] == pat[j]; i++,j++)
;
}
if(j == lastp)
{
return start;
}
}
return -1;
}
void fail(char *pat)
{
int n = strlen(pat);
int j=0, i;
failure[0] = -1;
for(j=1; j< n; j++)
{
i = failure[j-1];
while((pat[j] != pat[i+1]) && (i>=0))
{
i= failure[i];
}
if(pat[j] == pat[i+1])
{
failure[j] = i+1;
}
else failure[j] = -1;
}
}
int pmatch(char *string, char *pat)
{
int i=0;
int j=0;
int lens = strlen(string);
int lenp = strlen(pat);
while(i < lens && j < lenp)
{
if(string[i] == pat[j])
{
i++, j++;
}
else if(j==0)
{
i++;
}
else
{j = failure[j-1]+1;}
}
return ( (j == lenp) ? (i-lenp) : -1);
}
int main()
{
printf("문자열을 입력하세요.\n");
scanf("%s", &string);
printf("패턴을 입력하세요.\n");
scanf("%s", &pat);
printf("\n처음부터\n%s\n[%d]번째\n",pat, compare(string, pat));
printf("\nnfind\n%s\n[%d]번째\n", pat, nfind(string, pat));
printf("\npmatch\n%s\n[%d]번째\n", pat, pmatch(string, pat));
}