指针小知识点:

int a =10;

int *p=&a;

int *q=p;        //p中保存的是a的地址

int *q=p;       //将p的值赋给q 作用是让q也指向a


strlen( ); 求字符串的长度

strcpy( ); 复制字符串

strcat( ); 连接字符串

strcmp( ); 字符串大小的比较


 1 typedef   unsigned int  size_t
 2 
 3 size_t   my_strlen  (const char *str)            // strlen()
 4 {
 5      assert(str!=NULL); 
 6      int len=0;
 7      while(*str != '\0')    
 8      {
 9          len++10          str++11      }
12        return len;
13 }
14 
15 //不使用中间变量  利用递归;
16   size_t my_strlen(const char *str)    
17 {
18       assert(str!=NULL);
19       if (*str=='\0')
20              return 0;
21       else
22           return my_strlen(++str)+1;  
23 }


 1 char* my_strcpy(char *dest,const char *src)             //  strcpy()
 2 {
 3      assert(dest!=NULL&&src!=NULL);
 4      char *dest_tmp=dest;               //保护参数
 5      const char *src_tmp=src;          //类型匹配
 6      while(*src_tmp!='\0')
 7     {
 8         *dest_tmp++=*src_tmp++;
 9      }
10 
11       *dest_tmp='\0';
12            return dest;
13 }
14 
15 void main()
16 {
17       char s1[20];
18       char *s2 = "abcde";
19       my_strcpy(s1, s2);
20       cout<<"s1 = "<<s1<<endl;   //abcde         //C++输出方式
21 }
22 //     或者第三方接受
23 void main()
24 {
25       char s1[20];
26       char *s2 = "abcde";
27       char *s3= my_strcpy(s1, s2);
28       cout<<"s3 = "<<s3<<endl;      //abcde
29 }

 1 char* my_strcat(char *dest,const char *src)               //  strcat()
 2 {
 3   assert(src!=NULL&&dest!=NULL)
 4   char *dest_tmp=dest;                     //保护参数
 5   const char *src_tmp=src;                //类型匹配
 6   
 7    while(*dest_tmp!='\0') 
 8       dest_tmp++;
 9    while(*src_tmp!='\0')
10      *dest_tmp++=*src_tmp++;
11 *dest_tmp='\0';
12 return dest;
13 }
14 
15 void main()
16 {
17     char s1[20] = "abcdef ";
18     char s2[20] = "ghijk ";
19     char *str1 = my_strcat(s1, s2);
20     cout<<"s1 = "<<s1<<endl;
21     cout<<"str1 = "<<str1<<endl;   //abcdefghijk     //C++输出方式
22 
23 }

 1 /*  strcmp(s1,s2);  
 2      s1>s2 : 返回1   
 3      s1=s2 : 返回0   
 4      s1<s2 : 返回-1
 5 */
 6 
 7 int my_strcmp(const char *str1, const char *str2)           //strcmp()
 8 {
 9     assert(str1!=NULL && str2!=NULL);
10     if(*str1=='\0' && *str2=='\0')
11         return 0;
12     while(*str1!='\0' && *str2!='\0')
13     {
14         if(*str1 > *str2)
15             return 1;
16         else if(*str1 < *str2)
17             return -1;
18         str1++;
19         str2++;
20     }
21     if(*str1=='\0' && *str2!='\0')
22         return -1;
23     if(*str1!='\0' && *str2=='\0')
24         return 1;
25     return 0;
26 }
27 
28 //      或者
29 int my_strcmp(const char *str1, const char *str2)
30 {
31     assert(str1!=NULL && str2!=NULL);
32     int result = 0;
33     while(*str1!='\0' || *str2!='\0')
34     {
35         if( ( result = *str1-*str2 ) !=0 )
36             break;
37         str1++;
38         str2++;
39     }
40     if( result > 0 )
41         result = 1;
42     else if( result < 0 )
43         result = -1;
44     return result;
45 }

注意:

1、判断参数的有效性;

        (断言) 所传的参数不能为空。

2、若需要返回指针,使用中间变量;

         my_strcpy(); my_strcat();

3、确保空间足够

         my_strcpy(); my_strcat();

4、参数保护 保证参数不被函数内部所修改