- 实现重要的库函数(strcpy 、strncpy、memcpy)
1.1、char * strcpy(char* dest, const char* src)//将src拷贝到dest
char* strcpy(char* dest, const char* src)
{
assert(dest != NULL && stc != NULL);//1.判断指针是否合法
char* temp = dest; //2.保存最终返回的dest头指针
while ((*temp++ = *src++) != '\0'){}//判断拷贝终止条件
return dest;
}
1.2、char* mystrncpy(char* dest, const char* src, int len) //与strcpy相似,如果复制了n个字符,则终止。
char* mystrncpy(char* dest, const char* src, int len)
{
assert(dest != NULL && stc != NULL);//1.判断指针是否合法
char* temp = dest; //2.保存最终返回的dest头指针
int i = 0; //计数
while (i++ < len && (*temp++ = *src++) != '\0'){}//3.判断拷贝终止条件(注意两个判断条件不能互换,否则多拷贝一个字符)
if (*(--temp) != '\0')
*temp = '\0'; //4.如果src.size>len,导致最后一个字符不是'\0',需要补充。
return dest;
}
1.3、void* mymemcpy(void* dest, void* src, int len) //字节复制,只有一个终止条件
void* memcpy(void* dest, void* src, int len)
{
int i = 0;
//将void*转换成char*,一次移动一个字符
char* tempdest = (char*)dest;
char* tempsrc = (char*)src;
//判断dest和src重叠问题
if (tempdest < tempsrc || tempdest >(tempsrc + len - 1))//不重叠时,从左向右拷贝
{
while (i < len)
{
*tempdest++ = *tempsrc++;
i++;
}
}
else//重叠时,从右向左拷贝
{
tempdest += len;
tempsrc += len;
i = len;
while (i > 0)
{
*tempdest-- = *tempsrc--;
i--;
}
}
return dest;
}
1.4、void *memset(void *s, int ch, size_t n)//将s所指的地址后n个字节初始化为ch