• strcpy函数的实现


    大家一般觉得名不见经传strcpy函数实现不是非常难,流行的strcpy函数写法是:

    char *my_strcpy(char *dst,const char *src)
    {
    	assert(dst != NULL);
    	assert(src != NULL);
    	char *ret = dst;
    	while((* dst++ = * src++) != '') 
    		;
    	return ret;
    }
    假设注意到:

    1,检查指针有效性;

    2,返回目的指针des;

    3,源字符串的末尾 '' 须要拷贝。

    写出上面实现函数就不在话下。

    然而这种实现没有考虑拷贝时内存重叠的情况,以下的測试用例就能使调用my_strcp函数的程序崩溃:

    char str[10]="abc";
    my_strcpy(str+1,str);

    然而调用系统的strcpy函数程序正常执行,打印str结果为“aabc”!可见系统strcpy函数的实现不是这种。

    strcpy的正确实现应为:

    char *my_strcpy(char *dst,const char *src)
    {
    	assert(dst != NULL);
    	assert(src != NULL);
    	char *ret = dst;
    	memcpy(dst,src,strlen(src)+1);
    	return ret;
    }
    memcpy函数实现时考虑到了内存重叠的情况,能够完毕指定大小的内存拷贝,它的实现方式建议查看文章“卓越的教练是怎样训练高手的?”,会获益良多,这里仅粘帖函数memcpy函数的实现:

    void * my_memcpy(void *dst,const void *src,unsigned int count)
    {
         assert(dst);
         assert(src);
         void * ret = dst;
         if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重叠,低字节向高字节拷贝
    	 {
    		 while(count--)
    		 {
    			 *(char *)dst = *(char *)src;
    			 dst = (char *)dst + 1;
    			 src = (char *)src + 1;
    		 }
    	 }
    	 else						//源地址和目的地址重叠,高字节向低字节拷贝
    	 { 
    		 dst = (char *)dst + count - 1;
    		 src = (char *)src + count - 1; 
    		 while(count--) 
    		 {
    			 *(char *)dst = *(char *)src;
    			 dst = (char *)dst - 1;
    			 src = (char *)src - 1;
    		 }
        }
    	return ret;
    }
    两者结合才是strcpy函数的真正实现吧。



  • 相关阅读:
    用 tableExcel导出EXCEL数据
    个人作业——软件评测
    结对第二次作业——某次疫情统计可视化的实现
    软工实践寒假作业(1/2)
    java注解和反射
    共享密钥
    鲁棒性验证-第五小组
    维数约减报告--第五小组
    网络1911、1912 D&S第1次作业--线性表批改总结
    网络1911、1912 C语言第4次作业--函数批改总结
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4552624.html
Copyright © 2020-2023  润新知