了解c编程数据结构

时间:2013-08-15 09:35:27

标签: c arrays pointers

我找到了代码:

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

有人可以暗示---&gt;指针? 我不知道我是否可以问这个问题,但我理解这些概念,我做了!

2 个答案:

答案 0 :(得分:1)

我认为你知道代码应该做什么。该函数有一个非常evocative name

因此,直接在代码中解决查询,而不会过多地分析代码(它不完整):

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

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

因此i设置为skipTable[*search]处的值,search(这是一个指针)递增(可能指向某个数组中的下一个值)。

lastChar = *--search;与之前类似。 search递减,然后解除引用。这样就可以获得字符串中的 previous 值。

再次

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

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

答案 1 :(得分: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重新设置为比较开始之前指向的位置,再加上一个字符以从该点开始搜索。