我编的这个函数为什么没能实现功能?

7.编写一个函数string_in(),它接受两个字符串指针参数。如果第二个字符串被包含在第一个字符串中,函数就返回被包含的字符开始的地址。例如,string_in("hats","at")返回hats中a的地址,则,函数返回空指针。在一个使用循环语句为这个函数提供输入的完整程序中进行测试。
char string_in(char *p1,char *p2){
int m = 0;
int i;
char *p3 = p2;
char *p4;
while(*p1 != *p2)
++p1;
p4 = p1;
while(*p3 != '\0'){
p3++;
m++;
}
for(i = 0;i < m;i++){
if(
++p1 != *++p2)
return NULL;

}
return p4;

}
正确答案:
char string_in(char *p1,char *p2)
{
char *p1_save = p1, *p2_save = p2;
if(*p1 == '\0' || *p2 == '\0') return NULL;
while(1)
{
if(*p1 == *p2)
{
if(
++p2 == '\0') return p1_save;
if(*++p1 == '\0') return NULL;
}
else
{
if(*++p1 == '\0') return NULL;
p1_save = p1;
p2 = p2_save;
}
}
}
我感觉有点想不到?还有其他方法吗?

char* string_in(char *p1,char *p2)
{
for(int i=0;p1[i]!='\0';i++)
{
if(p1[i]==p2[0])
{
int j=1;
for(;p2[j]!='\0';j++)
{
if(p2[j]!=p1[i+j]) break;
}
if(p2[j]=='\0') return &(p1[i]);//如果p2已经遍历到了结尾,说明全部字符匹配
}

}
return NULL;

}


首先,你的方法里面用while计算出m作为for循环的计数值,这是没有必要的,直接判断是否到达结尾'\0'就行了,另外,返回的应该是char *,而不是char.

编程没有什么“正确答案”。
关键是搞清楚什么算法,这个问题的最佳做法就是KMP算法

http://blog.csdn.net/joylnwang/article/details/6778316

另外,被你视作“正确答案”的程序,一看代码那么简单,我就知道肯定不对

 int main()
{
    char s1[] = "abcbcd";
    char s2[] = "bcd";
    char * s3 = string_in(s1,s2);
    printf("%s", s3);
}

结果居然是null

http://codepad.org/jSoCLpce

如果你对算法一窍不通,你能想到的最简单的做法就是死算,也就是两重循环。算法复杂度O(N^2)
像你这种根本没有两重循环的,看都不要看,就知道肯定不对。