我不明白strncmp函数中下面的代码究竟发生了什么。为什么是(all+j*100)+i
?
/* Search jth string in char all[][100] for *pat*/
int PatternSearch( int j, char *all, char *pat )
{
int i;
for ( i=0; i < strlen(all+j*100); i++ )
{
if ( strncmp(pat, ((all+j*100)+i), strlen(pat)) == 0 )
{
return(i); // *pat found at ith byte of all[j]
}
}
return(-1); // *pat not found in all[j]
}
如果有人能够详细向我解释for循环中发生了什么,那将是很棒的。
答案 0 :(得分:-1)
第一行的评论解释了这一切。数组all
被分成100个字符的块,参数j
告诉从哪个块开始寻找模式。 strncmp
应用于从j
块开始处开始的所有位置,直到数组结束。返回值是相对于j
块的开头找到模式的字符的偏移量。
(all+j*100)+i
做什么?
j*100
获取数组j
块的第一个元素的索引。也就是说,如果j
为2,则获得200,这是第二个块的第一个元素的索引(开头的块是第0个块)。
all+j*100
与&all[j*100]
相同,因此它只是获取指向我们所讨论的元素(或块的开头)的指针,在本例中为&all[200]
。< / p>
最后+i
将指针递增i
,而i
是第一次循环时迭代的迭代器,strncmp()
的输入将为{{1}然后是&all[200]
,然后是&all[201]
,依此类推,直到找到模式或到达数组的末尾。
文字100的选择,并使用它将数组分成块,似乎是该函数的程序员做出的选择。它确实不需要,你可以随时用&all[202]
调用该函数,并且可以正常完成对模式的搜索而不使用任何东西。但程序员可能知道在他的数组中,模式总是在数组中找到几百个字符,所以他给调用者一个机会开始寻找模式j=0
- 数组中的百个字符,以便搜索做得更快。
示例 - 为简单起见,想象一个文字5而不是100,其中包含:
j
如果参数传递为arr = "abcdefghijklm";
pat = "gh";
,则循环中的第一个j=0
将使用strncmp
调用&arr[0]
字符,第二个'a'
查看&arr[1]
等等,直到找到模式。它会在'b'
('g'
)上找到,因此返回值为&arr[6]
。
如果参数传递为6
,则循环中的第一个j=1
将使用strncmp
调用&arr[5]
字符,第二个'f'
查看将找到模式的&arr[6]
,这样就会返回'b'
。