#include <stdio.h>
#include <assert.h>
char* myStrcpy(char* dest, const char* src) {
assert(dest != NULL && src != NULL);
char* ret = dest;
if (dest < src || dest >= src + strlen(src)) {
while ((*dest++ = *src++) != '\0');
} else {
char* lastSrc = (char*)src + strlen(src) - 1;
char* lastDest = dest + strlen(src) - 1;
while (lastSrc >= src) {
*lastDest-- = *lastSrc--;
}
}
return ret;
}
性能优化和错误避免措施:
- 健壮性方面:
- 使用
assert
确保传入的dest
和src
指针不为空,避免空指针引用导致的未定义行为。
- 性能优化方面:
- 正向复制:当目标字符串在源字符串之前,或者目标字符串完全在源字符串之后时,采用正向复制,这是通常情况下的高效方式,减少了指针移动的复杂性。
- 反向复制:当目标字符串部分或全部位于源字符串范围内时,采用反向复制,从字符串末尾开始复制,避免覆盖还未复制的源字符串内容。这样可以正确处理内存重叠的情况,同时在这种情况下也保证了效率。