2017-10-21 164 views
1

我想寫接收無限,每當輸入序列匹配給定模式應該打印匹配已經發現並繼續搜索模式的其他事件輸入一個程序,我設法只是代碼這C-模式匹配

#include<stdio.h> 
    #include<string.h> 
    int main(){ 
     char ch; 
     char pattern[4]="1234"; 
     int i=0; 
     while(1){ 
     scanf(" %c",&ch); 
     if(ch==pattern[i]){ 
      i+=1; 
     } else { 
      i = 0; 
     } 
     if (i == 4) { 
      printf("match found!\n"); 
      i = 0; 
     } 
     //printf("%c",ch); 
     } 
     return 0; 
    } 

問題是,此代碼不處理像11234重複情況。

我的其他方式使用緩衝,它有一些錯誤

#include<stdio.h> 
#include<string.h> 
int main(){ 
    char ch; 
    char pattern[4]="1234"; 
    char buf[4] = ""; 
    int i=0; 
    while(1){ 
    scanf(" %c",&ch); 
    buf[i%4]=ch; 
    i++; 
    if(strcmp(pattern,buf)==0){ 
     printf("Match found"); 
    } 
    } 
    return 0; 
} 

幫我解決這個問題

+0

https://en.wikipedia.org/wiki/String_searching_algorithm – Ryan

+1

[完全字符串匹配算法](http://www-igm.univ-mlv.fr/~lecroq/string /index.html)非常有用。 –

回答

2

的問題是,當一個給定的角色,讓我們說第二1進入,不履行if(ch==pattern[i]) -condition,你「復位」的模式,但你不會檢查這個已進入1爲「新」模式檢查的開始。所以寫:

else { 
    i = (ch==pattern[0]) ? 1 : 0; 
+0

如果要找到的模式是「1213」並且輸入是「121213」,這可能會遇到問題。這裏顯然是一個比賽,但是當第二2無法匹配3,重新回到模式的開始意味着,1213錯過。 –