IT

pmatch !

kio467 2014. 6. 9. 11:11

#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));

}