指针小知识点:
int a =10;
int *p=&a;
int *q=p; //p中保存的是a的地址
int *q=p; //将p的值赋给q 作用是让q也指向a
strlen( ); 求字符串的长度
strcpy( ); 复制字符串
strcat( ); 连接字符串
strcmp( ); 字符串大小的比较
typedef unsigned int size_t
size_t my_strlen (const char *str) // strlen()
{
assert(str!=NULL);
int len=0;
while(*str != '\0')
{
len++;
str++;
}
return len;
}
//不使用中间变量 利用递归;
size_t my_strlen(const char *str)
{
assert(str!=NULL);
if (*str=='\0')
return 0;
else
return my_strlen(++str)+1;
}
char* my_strcpy(char *dest,const char *src) // strcpy()
{
assert(dest!=NULL&&src!=NULL);
char *dest_tmp=dest; //保护参数
const char *src_tmp=src; //类型匹配
while(*src_tmp!='\0')
{
*dest_tmp++=*src_tmp++;
}
*dest_tmp='\0';
return dest;
}
void main()
{
char s1[20];
char *s2 = "abcde";
my_strcpy(s1, s2);
cout<<"s1 = "<<s1<<endl; //abcde //C++输出方式
}
// 或者第三方接受
void main()
{
char s1[20];
char *s2 = "abcde";
char *s3= my_strcpy(s1, s2);
cout<<"s3 = "<<s3<<endl; //abcde
}
char* my_strcat(char *dest,const char *src) // strcat()
{
assert(src!=NULL&&dest!=NULL)
char *dest_tmp=dest; //保护参数
const char *src_tmp=src; //类型匹配
while(*dest_tmp!='\0')
dest_tmp++;
while(*src_tmp!='\0')
*dest_tmp++=*src_tmp++;
*dest_tmp='\0';
return dest;
}
void main()
{
char s1[20] = "abcdef ";
char s2[20] = "ghijk ";
char *str1 = my_strcat(s1, s2);
cout<<"s1 = "<<s1<<endl;
cout<<"str1 = "<<str1<<endl; //abcdefghijk //C++输出方式
}
/* strcmp(s1,s2);
s1>s2 : 返回1
s1=s2 : 返回0
s1<s2 : 返回-1
*/
int my_strcmp(const char *str1, const char *str2) //strcmp()
{
assert(str1!=NULL && str2!=NULL);
if(*str1=='\0' && *str2=='\0')
return 0;
while(*str1!='\0' && *str2!='\0')
{
if(*str1 > *str2)
return 1;
else if(*str1 < *str2)
return -1;
str1++;
str2++;
}
if(*str1=='\0' && *str2!='\0')
return -1;
if(*str1!='\0' && *str2=='\0')
return 1;
return 0;
}
// 或者
int my_strcmp(const char *str1, const char *str2)
{
assert(str1!=NULL && str2!=NULL);
int result = 0;
while(*str1!='\0' || *str2!='\0')
{
if( ( result = *str1-*str2 ) !=0 )
break;
str1++;
str2++;
}
if( result > 0 )
result = 1;
else if( result < 0 )
result = -1;
return result;
}
注意:
1、判断参数的有效性;
(断言) 所传的参数不能为空。
2、若需要返回指针,使用中间变量;
my_strcpy(); my_strcat();
3、确保空间足够
my_strcpy(); my_strcat();
4、参数保护 保证参数不被函数内部所修改