2017-10-21 160 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错过。 –