这个阅读题思路是什么?

#include <stdio.h>
#include <string.h>
char * f(char p[], char s[])
{
    static int i = 0;
    int j = 0;
    while(p[i] && s[j])
    if(p[i++] == s[j]) j++;

    if(i == strlen(p))
    i = 0;
    return (p + i);

}
int main (){
    char * a = "Herehere";
    char * p , * b = "e";
    while((p = f(a,b))!=a)
    puts(p);


} 

while(p[i]&& s[j])
的条件是永真的吗?

哥子,其实前两天就看到你的问题的,结果没有回答,网页还在这里,我也来帮你理一下思路

#include <stdio.h>
#include <string.h>
char * f(char p[], char s[])
{
    static int i = 0;     // 注意这个静态变量只赋值一次
    int j = 0;
    while(p[i] && s[j])   // 你问的是这里,是否会死循环,先回答了,肯定不会。 
                                     // 当前有个前提,p和s是字符串, 因为 下面的i++ , 当 p字符串退到最后一个的时候,会是0,就会退出。
                                     // 来看看你的样例 Herehere 和 e 两个的对比,
    if(p[i++] == s[j]) j++;

    if(i == strlen(p))   // 如果i指针退到p的最后面,那就重新再来,这里和下面的退出条件有关系  
    i = 0;
    return (p + i);

}
int main (){
    char * a = "Herehere";
    char * p , * b = "e";
    while((p = f(a,b))!=a) // 这里就很巧妙了,只有 返回值和初始值相等,才能退出
                                       // 我们这里为啥退出,就是因为函数循环到头头,上面有个i=0,相当于 p=a+0 == a, 所以相等,就退出了
        puts(p);
} 

因为i和j都有++,所以每次判断的都不同
就你的程序来说,不会死循环,输出结果是
rehere
here
re