需要帮助了解for循环中的strncmp函数是做什么的

时间:2016-04-19 20:13:33

标签: c

我不明白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循环中发生了什么,那将是很棒的。

1 个答案:

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