未签名字符的长度*?

时间:2017-03-13 16:18:39

标签: c algorithm

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 *);

1 个答案:

答案 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。