2017-03-13 19 views
-4
void HorspoolMatching(unsigned char T[], char P[]) 
{ 

    int i = 0, k, m, n; 
    int count = 0; 
    //int *p; 
    int val; 

    ShiftTable(P); 

    m = strlen(P); 
    n = strlen(T); 

    i = m - 1; 

    while(i < n) 
    { 
     k = 0; 

     while((k < m) && (P[m - 1 - k] == T[i - k])) 
     { 
      k++; 
     } 

     if(k == m) 
     { 
      count++; 
      i += m; 


     } else{ 
      val = (int)T[i]; 
      if (val < 0 || val >= MAX) { 
       i = i + m; 
      } else { 
       i = i + table[val]; 
      } 

     } 
    } 
    printf("%d\n", count); 
} 

...unsigned char *の長さ?私はエラーなし符号なしのパラメータの長さを取得するにはどうすればよい

printf("Enter name of the data file: "); 
       scanf("%s", filenameFOUR); 

       FILE *fp4; 

       fp4 = fopen(filenameFOUR, "r"); 

       if(fp4 == NULL) 
       { 
        printf("Error"); 
        exit(0); 
       } 

       while((inc = fgetc(fp4)) != EOF) 
       { 
        buf[n++] = (char) inc; 

       } 

       fclose(fp4); 

       printf("Enter a pattern to search: "); 
       scanf("%s", pat2); 


       ftime(&before); 
       HorspoolMatching(buf, pat2); 
       ftime(&after); 

       int diffTime4 = (after.time - before.time)*1000 + 
        (after.millitm - before.millitm); 

       printf("Time it took: %d milliseconds.\n", diffTime4); 

?私の出力が正しくないので、符号なしの文字に変更することをお勧めしました。私はhorspoolアルゴリズムを使用して一致を見つけるためにテストファイルを調べようとしています。

warning: passing 'unsigned char *' to parameter of type 
     'const char *' converts between pointers to integer types with different 
     sign [-Wpointer-sign] 
     n = strlen(T); 
       ^
/usr/include/string.h:82:28: note: passing argument to parameter here 
size_t strlen(const char *); 
+0

メインを追加してください。 –

+0

'テーブル'とは何ですか? 'ShiftTable'とは何ですか?これをお読みください[mcve]。 –

+2

*文字列*がある場合、なぜ 'char'の代わりに' unsigned char'を使うのですか?データが文字列でない場合は、 'strlen'を使用することはできず、関数の引数としてデータの長さを渡す必要があります。 –

答えて

3

あなたは悪影響なしstrlenためchar *unsigned char *を唱えられます。しかし、あなたのコードでは、はるかに緊急の問題があります。 char sが署名される場合がありますので

P[m - 1 - k] == T[i - k]は正しくありません。そして、P[m]が署名されるだろうとT[n]符号なしされるだろう - に符号ビットを持つ文字はCHAR_BITを持つマシン上で符号なしの値> = 128を持つ(すなわち一致しません8)。 Horspool's algorithmは文字を配列のインデックスとして使用するので、両方のパラメータをunsigned char[]とするのが最も簡単です。さらに良い:引数としてchar *を受け入れながら、それらを表現するためにタイプunsigned char *の変数を使用します。また、文字列の長さを受け入れるよう

void HorspoolMatching(char T[], char P[]) { 
    unsigned char *t = (unsigned char*)T; 
    unsigned char *p = (unsigned char*)P; 
    // and use t and p here on. 
} 

しかし、マッチングを書き込むことがより一般的ですパラメータとして - 文字列の長さはあらかじめ分かっているので、関数内で再度計算するのはコストがかかるでしょう。一致が見つからない場合、私は最初の試合の初め、またはNULLにchar *をいただきたい - このように私は、戻り値がいずれかの有用ではありませんよう

char *HorspoolMatching(char T[], size_t T_len, char P[], size_t P_len); 

voidとして関数を宣言お勧めします。

関連する問題