#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char *StrCpy(char *dest, const char *src)
{
assert((dest != NULL) && (src != NULL));
char *str = dest;
while ((*dest ++ = *src ++) != '\0');
return str;
}

int Strlen(const char *str)
{
assert((str != NULL));
int len = 0;
while (*str ++)
{
len++;
}
return len;
}

int StrCmp(const char *str1, const char *str2)
{
assert((str1 != NULL) && (str2 != NULL));
int rt = 0;
while ( !(rt = *(unsigned char *)str1 - *(unsigned char*)str2 ) && *str2)
{
str1 ++;
str2 ++;
}
if (rt > 0)
{
rt = 1;
}
else if (rt < 0)
{
rt = -1;
}
return rt;
}

//为了解决内存重叠的现象
void *MemCpy(void *dst, const void *src, size_t count)
{
char *pdst = static_cast<char *>(dst);
const char *psrc = static_cast<const char *>(src);

if (pdst > psrc && pdst < psrc + count)
{
for (int i = count - 1; i >= 0; i--)
{
pdst[i] = psrc[i];
}
}
else
{
for (int i = 0; i < count; i++)
{
pdst[i] = psrc[i];
}
}
return dst;
}

// memcpy 实现源码
void * __cdecl memcpy (
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;

while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}

return(ret);
}

int main()
{
char str2[100] = "abcd";
char *str1 = (char *)malloc(100);
str1= str2 + 2;
//考虑了内存重叠
MemCpy(str1, str2, 5);
printf("调用MemCpy后str1的内容: %s\n", str1);

strcpy strlen memcpy等的函数实现的更多相关文章

  1. sprintf、strcpy 及 memcpy 函数区别

    这些函数的区别在于 实现功能 以及 操作对象 不同.strcpy 函数操作的对象是 字符串 ,完成 从 源字符串 到 目的字符串 的 拷贝 功能. sprintf 函数操作的对象 不限于字符串 :虽然 ...

  2. strcpy和memcpy,memmove函数的区别

    strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...

  3. strcpy vs memcpy

    [本文连接] http://www.cnblogs.com/hellogiser/p/strcpy_vs_memcpy.html [分析] strcpy和memcpy都是标准C库函数,它们有下面的特点 ...

  4. strcpy、memcpy和memset之间的区别

    今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...

  5. strcpy和memcpy的区别(转载)

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

  6. 【转】 strcpy和memcpy的区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

  7. 关于strcpy和memcpy

    strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.已知strcpy函 ...

  8. strcpy和memcpy的区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

  9. strcpy与memcpy的区别

    strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...

随机推荐

  1. struts2:字段校验和非字段校验代码示例

    一.为什么要使用struts2的validate验证框架 :使用struts2的验证框架,能够提高客户端提交的数据的安全性.通过验证,确保保存进数据库的信息是正确的 二.使用struts2的valid ...

  2. eclipse设置汉化

    1. 打开eclipse->help->install new software 2. 打开http://www.eclipse.org/babel/downloads.php,,,找到相 ...

  3. Hash工具下载地址

    因为经常要在非常用电脑使用,这里放一个链接,方便下载: http://files.cnblogs.com/files/cxun/Hash.zip HASH计算工具,可计算MD5.SHA-1.CRC32 ...

  4. 基于配置文件(xml)的S2S3H3搭建

    本次环境选择:JDK1.6+MySQL数据库+C3P0连接池+(struts2,spring3,hibernate3) 首先,创建WEB工程 然后倒入相关jar包(maven项目,在pom.xml中导 ...

  5. C++多级指针与多维数组详细介绍

    多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下:    int val=10;    int *ptr=&val;    int **pptr= ...

  6. ES6里箭头函数的陷阱

    ECMAScript 6新增了箭头函数 原来的匿名函数 function(){},现在可以简化成()=>{} 看起来高大上,像C#什么的语法. 但是箭头函数的this对象,不能更改,总是指向函数 ...

  7. AngularJs--angular-pagination可复用的分页指令

    1.angular-pagination 是基于angular 编写的可复用分页指令 安装 克隆项目到本地: git clone https://github.com/febobo/angular-p ...

  8. WebBrowser内核指定

    一.背景 这几天在维护公司的一个项目,嗯…到现在七八年没人动过了(也是老古董了),都说N年前的代码碰不得 处处是坑 不能挖坑还得一步一步的填坑,恰好今天就填了一坑 此处作为记录 供以后翻阅,对代码除了 ...

  9. JAG Summer 2012 Day 4 C Connect

    状压dp,由于枚举两维状态会GG,所以只枚举当前位置前m个的状态,就是这个样子大概= =: 呆马: #include <iostream> #include <cstdio> ...

  10. OC-01 编译链接的作用

    编译:检测代码的语法合法性,随后生成.o文件. 链接:把项目中所有的.out合并,生成一个可执行文件. OC编译连接过程 .m---->.o---->.out  . 检测源文件的语法合法性 ...