我找到了代码:
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;指针? 我不知道我是否可以问这个问题,但我理解这些概念,我做了!
答案 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
重新设置为比较开始之前指向的位置,再加上一个字符以从该点开始搜索。