strstr ()函数:
strstr (str1,str2)函数用于判断字符串str2是否是str1的子串。如果是,则返回str2在str1中首次出现的地址:否则,返回NULL。
在库函数中 strstr ()函数的原型是 char   strstr   const   char   * str1,  const   char   * str2 ),包含在头文件<string.h>中。
思路:1.判空及判断str1与str2的长度比较;
2. 从字符串str1和str2开始遍历,直到str2结束,即遇见str2的 '\0' ,寻找成功,返回str1与str2第一个字符相等的首地址,否则,返回NULL;

3.在第二种情况下,在相同几步之后有可能有不相等的情况,如:“12234”与“234”,则将开始的str1++,重复第2步;

4..在这里写代码时需注意的几点:const(保证了数据的安全性);char*(为了实现链式访问);重复时的处理即第三种情况。相信,细节乃画龙点睛之笔喔!

5.代码:

(1)在库中的代码如下:


char  strstr  const  char  * str1,  const  char  * str2 )
{
         char  *cp = ( char  *) str1;
         char  *s1, *s2;
  
         if  ( !*str2 )
             return (( char  *)str1);
  
         while  (*cp)
         {
                 s1 = cp;
                 s2 = ( char  *) str2;
  

                while ( *s1 && *s2 && !(*s1-*s2) )/*在c语言中指针与指针相减,得到的是元素的个数*/


                         s1++, s2++;
  
                 if  (!*s2)
                         return (cp);
  
                 cp++;
         }
  
         return (NULL);
  

}

(2)我的代码:

# include <stdio.h>
char  * my_strstr(  const  char  *s1,  const  char  *s2)  
{  
     int  n=0;   //在开始比较字符相等时走的步数
     if  (*s2)  
     {  
         while  (*s1)  
         {  
             if  (*(s1 + n) == *(s2 + n))
             {
                 if  (*(s2 + n + 1) == NULL)
                 {
                     return  ( char  *)s1;
                 }
                n++;
             }
            /* for (n=0; *(s1 + n) == *(s2 + n); n++)  
             {  
  
                 if (*(s2 + n + 1)==NULL)  
                     return (char *)s1;  
             }  */
             s1++;     //只要第n次不相等时,就进行s1++,直到满足条件时开始返回执行循环语句
         }  
         return  NULL;  
     }  
     else  
         return  NULL;