Advertisement
Guest User

Untitled

a guest
Mar 30th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <time.h>
  6.  
  7. int bmh(char *str, char *pattern, int fpos);
  8.  
  9. int main(void)
  10. {
  11.     char src[16];
  12.     char seek[] = "vasyan";
  13.     int ret = 0;
  14.     int sz = strlen(seek);
  15.  
  16.     FILE *fp = fopen("test.txt", "r");
  17.     if(fp == NULL) {
  18.         printf("fopen error\n");
  19.         return 1;
  20.     }
  21.  
  22.     ret = fread(src, sizeof(char), 15, fp);
  23.     src[ret] = '\0';
  24.     int fpos = 0;
  25.  
  26.     printf("Seek for substring: %s\n", seek);
  27.  
  28.     while(1){
  29.  
  30.         ret = bmh(src, seek, fpos);
  31.         if(ret >= 0) {
  32.             fpos += ret;
  33.             break;
  34.         } else {
  35.             fpos += strlen(src) - sz + 1;
  36.         }
  37.  
  38.         memmove(src, &src[16-sz-1], sz);
  39.  
  40.         ret = fread(&src[sz], sizeof(char), 15-sz, fp);
  41.  
  42.         if(ret == 0) {
  43.             ret = -1;
  44.             break;
  45.         }
  46.     }
  47.  
  48.     if(ret >= 0)
  49.         printf("Substring found at %d\n", fpos);
  50.     else
  51.         printf("Substring not found\n");
  52.  
  53.     return 0;
  54. }
  55.  
  56. int bmh(char *str, char *pattern, int fpos)
  57. {
  58.     int shift[256];
  59.     int n = strlen(str);
  60.     int m = strlen(pattern);
  61.  
  62.     char ch, lastch;
  63.  
  64.     for(int i=0;i<256;i++)
  65.         shift[i] = m;
  66.  
  67.     for(int i=0;i<m-1;i++)
  68.         shift[pattern[i]] = m - i - 1;
  69.  
  70.     lastch = pattern[m - 1];
  71.     for(int i=0;i<=n-m;i+=shift[ch]) {
  72.         ch = str[i+m-1];
  73.         if(ch == lastch) {
  74.             if(memcmp(&str[i], pattern, m-1) == 0)
  75.                 return i;
  76.         }
  77.     }
  78.  
  79.     return -1;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement