简单实现
char *strcpy(char* dest, const char* src){
assert(src != NULL && dest != NULL);
char* tmp = dest;
while( (*dest++ = *src++) != '\0' )
return tmp;
}
tips: 为了实现链式连接。返回内容为指向目标内存的地址指针,这样可以在需要字符指针的函数中使用strcpy,例如strlen(strcpy(str1, str2)).
考虑内存重叠安全实现
char *strcpy(char* dest, const char* src){
assert(src != NULL && dest != NULL);
char* tmp = dest;
int cnt = strlen(src) + 1;
if(dest >= src && dest <= src+cnt-1){ //内存重叠,从高地址开始复制
dest = dest+cnt-1;
src = src+cnt-1;
while(cnt--)
*dest-- = *src--;
} else{
while(cnt--)
*dest++ = *src++;
}
return tmp;
}
strncpy
附:搞清strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数的实现
strcmp
int strcmp(const char* str1, const char* str2)
{
int ret = 0;
while (!(ret = (*str1-*str2)) && (*str2) )
{
str1++;
str2++;
}
if (ret > 0)
return 1;
if (ret < 0)
return -1;
return 0;
}
//or
int Mystrcmp(const char *str1, const char *str2){
assert(NULL != str1 && NULL != str2);
while(*str1 && *str2 && (*str1 == *str2)){
str1 ++;
str2 ++;
}
return (*str1 - *str2);
}