zoukankan      html  css  js  c++  java
  • 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函数的真正实现吧。



  • 相关阅读:
    第四周作业
    RHEL6+GFS2+MYSQL高可用
    第三周作业
    第二周作业
    centos7 安装redis 开机启动
    无线网卡连接网络后共享给本地有线网卡使用(Win10)
    第一周作业
    2019.8.13加入博客园
    智力题
    Python入门基础学习(模块,包)
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4251284.html
Copyright © 2011-2022 走看看