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;