#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