2

我找到了代码:

char *BoyerMoore_negative(char *string, int strLength)
{
    char *data ="nice bad good worst";
    int dataLength = strlen(data) - 1;
    int skipTable[256], i;
    char *search;
    register char lastChar;

    if (strLength == 0)
        return NULL;

    // Initialize skip lookup table
    for (i = 0; i < 256; i++)
        skipTable[i] = strLength;   //strlength is numbers of words in sentence

    search = string; //string is array of words in the sentence
    i = --strLength; // Decrease strLength here to make it an index

    do {
        skipTable[*search++] = i; // ---> skiptable is int array and search is string. Then what happens on LHS on each iteration???
    } while (i--);

    lastChar = *--search; // ---> Decreamenting string pointer? What does it mean on RHS?

    do {
        // Have we found the entire string?
        if (i-- == 0)
            return search;
    } while (*--search == string[i]);

    // Skip past the part of the string that we scanned already
    search += (strLength - i + 1);     ---> what happends here?
    dataLength--;

有人可以给出--->指针的提示吗?我不知道我是否可以问这种问题,但为了我理解这些概念,我做到了!

4

2 回答 2

1

我想你知道代码应该做什么。该功能有一个非常令人回味的 名字

因此,直接在代码中处理查询,无需过多分析代码(不完整):

search是一个指针。不是字符串本身,而是指向该字符串的指针。人们可能期望string指向某个字符串的开头,并search设置为指向相同的值。

skipTable[*search++] = i; 取消对指针的引用,获取指向的值search,然后递增指针。由于skipTable它是一个 255 个整数的数组并且search是一个 char 指针,因此如果 char 是无符号的(取决于编译器),这将永远不会超出 x86 的范围。真的,应该有演员表;skipTable[(unsigned char) *search++]. (严格来说,这仍然不是便携式的)。

Soi设置为 at 的值,skipTable[*search]并且search(它是一个指针)递增(可能指向某个数组中的下一个值)。

lastChar = *--search;和以前类似。search递减,然后取消引用。所以这会得到字符串中的前一个值。

search += (strLength - i + 1);再次,指针正在增加。ifstrLength表示字符串的长度

正如评论中指出的那样,以下不是一个好主意: char *data ="nice bad good worst"; 您在代码中定义的字符串不能被修改,但是因为您有一个指向它的指针,所以您可以尝试。尝试修改指向的字符串的结果data是未定义的,但几乎总是会导致崩溃。

于 2013-08-15T10:16:39.350 回答
1
skipTable[*search++] = i;

这在可能被签名的平台上实际上是危险的char,在这种情况下,某些值可能会产生负索引和非法访问。应该:

skipTable[*search++ & 255] = i;

它及其周围的循环所做的是填充skipTable一些关于您可能在搜索空间中发现的每个字符的信息。具体来说,如果您在c搜索时找到字符,那么 的值skipTable[c]将是您正在搜索的字符串的开头距离该字符出现的距离。如果它没有出现在那个字符串中,那么我们得到默认的最大值——整个字符串的长度。

lastChar = *--search;

这意味着search表达式之前的值指向比我们想要的更远的一个字符。也就是说,它从字符串的末尾开始计数,现在指向(可能)一个NUL字符。我们想从中减去一个,然后看看它指向什么字符。我们还希望保留 的修改值search

search += (strLength - i + 1);

为简洁起见,您似乎删除了一些代码,因此很难在这里准确地说出发生了什么。

看起来它只是执行了一个字符串比较,从字符串的远端开始,发现了一个不匹配的地方。 i可能从要比较的字符串末尾递减时开始strLength倒计时。string在这种情况下,上面的行将重新设置search为它在比较开始之前指向的位置,再加上一个字符以从该点开始搜索。

于 2013-08-15T10:29:58.580 回答