2017-10-21 1 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番目の2が3に一致しなかった場合、パターンの先頭に戻すと、1213が見逃されます。 –

関連する問題