strcpy()的简单实现,不考虑内存重叠的情况
char* strcpy(char* dst, const char* src)
{
if(dst == NULL || src == NULL)
return NULL;
char* ret = dst;
while((*dst++ = *src++) != '\0');
return dst;
}
上述实现中,当dst和src的内存存在重叠的情况下,会导致内存崩溃
如:
char str[5] = "ab";
strcpy(str+1, str);
优化:添加内存重叠的判读,当内存重叠时从后往前复制
char* strcpy(char* dst, const char* src, int size)
{
if (dst == NULL || src == NULL || size <= 0)
return NULL;
char* ret = dst;
if (ret > src && ret < src + size) //内存重叠
{
ret = ret + size - 1;
src = src + size - 1;
while (size--)
*ret-- = *src--;
}
else
{
while ((*dst++ = *src++) != '\0');
}
return dst;
}
strcpy()函数通过参数取得复制结果,为什么还要由返回值char* ?
为了实现链式连接,如strlen(strcpy(str1, str2));