memcpy memmove strcat strcopy strlen实现

转载 2007年10月06日 21:27:00

1. 如何实现如下copy函数,高手指教:
void memcopy(void *s,void *t, int length)
/* 要求实现内存拷贝length长度内容,源为*t,目的为*s    */
希望大家讨论,看如何正确的实现!

考虑到源地址和目的地址交叉的情况:
#include <stdio.h>
#include <memory.h>
#include <string.h>

//考虑到源地址和目的地址交叉的情况
void * my_memcpy( void *dest, const void *src, size_t count )
{
 unsigned char *psrc = (unsigned char*) src;
 unsigned char *pdst = (unsigned char*) dest;

 if (!pdst || !psrc || count <= 0)
  return dest;
 
 if (psrc < pdst) // 目的地址比源地址高,从后开始拷贝
 {
  psrc += count-1;
  pdst += count-1;
  
  do {
   *pdst-- = *psrc--;
  } while(--count);
 }
 else if (psrc > pdst) // 目的地址比源地址低,从前开始拷贝
 {
  do {
   *pdst++ = *psrc++;
  } while (--count);
 }
 
 return dest;
}

void * __cdecl memmove (
        void * dst,
        const void * src,
        size_t count
        )
{
        void * ret = dst;

        if (dst <= src || (char *)dst >= ((char *)src + count)) {
                /*
                 * Non-Overlapping Buffers
                 * copy from lower addresses to higher addresses
                 */
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
                }
        }
        else {
                /*
                 * Overlapping Buffers
                 * copy from higher addresses to lower addresses
                 */
                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);
}

2. 编写一个标准strcpy函数

char * strcpy( char *strDest, const char *strSrc )
{ 
  char *address = strDest;
 assert( (strDest != NULL) && (strSrc != NULL) );
 
 while( *strDest++ = * strSrc++ );
 

 return address;
}

3. strlen函数

size_t strlen( const char *str ) //输入参数const
{
 
char *old = str;
 assert( str != NULL ); //断言字符串地址非0
 
 while( *str++ );
  
 
return str-old-1;
}

4.strcat实现
char *my_strcat(char *dest,char *src)
{
 if ( NULL == dest || NULL == src)
 {
  return NULL;
 }
 while ( *dest++ != '/0');
 dest -= 1;
 while ( ( *dest++ = *src++) != '/0');
}

 

C语言实现strlen()4种方法和strcat()3种方法

#include #include #if 0 // 默认使用法4 // 法1 int strlen(const char* str) { int n; // const char *p = ...
  • wujunbo27
  • wujunbo27
  • 2014年11月07日 23:39
  • 1013

memmove 和 memcpy的区别以及处理内存重叠问题

memmove 和 memcpy的区别以及处理内存重叠问题
  • Li_Ning_
  • Li_Ning_
  • 2016年05月15日 19:30
  • 10634

memmove和memcpy函数的区别及实现

一、memmove()和memcpy()函数的strcpy()函数的区别;(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存...
  • gogogo_sky
  • gogogo_sky
  • 2017年05月21日 01:37
  • 348

关于memcpy和memmove两函数的区别

关于memcpy和memmove两个c标准库函数,其功能都是将一块内存区域中的指定大小内容复制到目标内存中,在翻阅c标准库实现的源代码我们发现他们是有区别的。首先看memcpy的实现: void * ...
  • caowei840701
  • caowei840701
  • 2013年01月10日 23:36
  • 1020

迅雷面试题:memcpy和memmove的区别

其实很早就知道两个函数其中有一个在面临内存覆盖时行为有点特别, 但是工作中很少用到此场景, 也就没有深究. 现在居然面试遇到了, 那就把研究清楚吧. memcpy 简单粗暴, 不考虑内存重叠问题. ...
  • zdl1016
  • zdl1016
  • 2013年03月16日 12:56
  • 2238

一些常用的字符串处理函数总结memcpy、memmove、memset、memcmp、memchr等

(1)原型void *memcpy(void *dest, const void *src, size_t n);  字符串复制函数,从内存区域src拷贝n个字节到dest,必须确保src和dest是...
  • u012088914
  • u012088914
  • 2016年03月06日 23:48
  • 825

strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数

strlen函数: int strlen(const char *str) { assert(str != NULL); int len; while((*str++) != '\0') { ...
  • hyg0811
  • hyg0811
  • 2013年07月17日 07:54
  • 4059

自己编写实现strcat()和strcmp()函数

#include #include #include #include using namespace std; void cat (char array1[] ,int m , char array...
  • qq_29486343
  • qq_29486343
  • 2015年08月01日 12:56
  • 730

字符串处理函数strcat和strtok

C函数编辑 原型 char *strcat(char *dest,char *src); extern 用法 #include 在C++中,则存在于头文件中。 功...
  • viewsky11
  • viewsky11
  • 2014年09月28日 11:07
  • 846

memcpy,memmove,strcpy,strcat等系列函数的实现(一)

一、memcpy函数:   1、定义函数:      void *memcpy(void *dest, const void *src, size_t n) 函数说明:      memcpy...
  • Baoge_leopard
  • Baoge_leopard
  • 2014年10月07日 00:17
  • 662
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:memcpy memmove strcat strcopy strlen实现
举报原因:
原因补充:

(最多只允许输入30个字)