EchoDemo's Blogs

Strcpy函数的实现

(1)strcpy函数的代码实现

char *strcpy(char *dst,const char *src){//源字符串参数用const修饰,防止修改源字符串。
    assert(dst != NULL && src != NULL);//检查指针的有效性,如果它的条件返回错误,则终止程序执行。
    char *ret = dst;
    while ((*dst++=*src++)!='\0');
    return ret;
}

(2)为什么要返回char *?

返回dst的原始值使函数能够支持链式表达式。链式表达式的形式如:int l=strlen(strcpy(strA,strB));又如:char * strA=strcpy(new char[10],strB);

返回strSrc的原始值是错误的。

其一,源字符串肯定是已知的,返回它没有意义。
其二,不能支持形如第二例的表达式。
其三,把const char *作为char *返回,类型不符,编译报错。

(3)考虑dst和src内存重叠的情况

所谓重叠,就是src未处理的部分已经被dst给覆盖了,只有一种情况:src<=dst<=src+strlen(src)。C函数memcpy自带内存重叠检测功能,下面给出memcpy的实现my_memcpy。

char *strcpy(char *dst,const char *src){
    assert(dst != NULL && src != NULL);
    char *ret = dst;
    my_memcpy(dst, src, strlen(src)+1);
    return ret;
}

my_memcpy的实现:

char *my_memcpy(char *dst, const char* src, int cnt){
    assert(dst != NULL && src != NULL);
    char *ret = dst; 
    if(dst >= src && dst <= src+cnt-1){//内存重叠,从高地址开始复制
        dst = dst+cnt-1;
        src = src+cnt-1;
        while (cnt--)
            *dst-- = *src--;
    }else{//正常情况,从低地址开始复制
        while (cnt--)
            *dst++ = *src++;
    }
    return ret;
}
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------