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);
}
...
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);
如何在没有错误的情况下获取unsigned参数的长度?我被建议更改为无符号字符,因为我的输出不正确。我试图通过测试文件使用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 :(得分:3)
您可以将unsigned char *
投放到char *
strlen
而不会产生不良影响。但是,您的代码存在更紧迫的问题。
由于char
可能已签名,因此P[m - 1 - k] == T[i - k]
不正确:然后P[m]
将被签名,而T[n]
将无符号 - 具有符号位的字符将不会匹配(即在具有CHAR_BIT
8的机器上具有无符号值&gt; = 128)。由于Horspool's algorithm使用字符作为数组的索引,因此最简单的方法是将两个参数都设置为unsigned char[]
。更好的是:使用unsigned char *
类型的变量来表示它们,同时接受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.
}
然而,更常见的是编写匹配,以便它也接受字符串的长度作为参数 - 通常预先知道字符串的长度,因此在函数内再次计算它将是昂贵的。因此,我建议将该函数声明为
char *HorspoolMatching(char T[], size_t T_len, char P[], size_t P_len);
void
因为返回值也没用 - 我char *
到第一个匹配的开头,如果找不到匹配则为NULL。