Skip to content

Instantly share code, notes, and snippets.

@superlayone
Last active August 29, 2015 14:03
Show Gist options
  • Select an option

  • Save superlayone/bc749789fe51f3322ff6 to your computer and use it in GitHub Desktop.

Select an option

Save superlayone/bc749789fe51f3322ff6 to your computer and use it in GitHub Desktop.
strcpy & memcpy

##strcpy & memcpy

这两个库函数的实现应该算是比较简单的,但是竟然看到了很多不正确的版本,其实只要注意以下几点就OK了

  1. 参数判断
  2. 返回指针临时保存
  3. 地址重叠判断
  4. '\0'复制
        char* MemCpy(char* dst, const char* src, int len){
        	assert( dst != nullptr );
        	assert( src != nullptr );
        
        	char* ret = dst;
        	//from left to right -> ->
        	if(dst <= src || dst >= (src + len)){
        		while(len--){
        			*dst++ = *src++;
        		}
        	}
        	//address overlapping
        	//down sequence <-<-
        	else{
        		dst = dst + len - 1;
        		src = src + len - 1;
        
        		while(len--){
        			*dst-- = *src--;
        		}
        	}
        	return ret;
        }
        char* StrCpy(char* dst, const char* src){
        	assert( dst != nullptr );
        	assert( src != nullptr );
        	return MemCpy(dst,src,strlen(src)+1);
        }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment