#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. Ref和Out参数的区别(转帖)

    首先,如果不使用这两个关键字,那是什么样 呢? 看下面的例子: using System;   class Test   {   static void Swap(ref int x, ref int ...

  2. mui小总结

    下拉刷新 第一: mui.init({ pullRefresh: { container: '#pullrefresh', up: { contentrefresh: '正在加载...', callb ...

  3. ebox学习之SD & fat 配置

    fatfs可配置项很多,相关的配置均在ffconfig.h文件中 /*----------------------------------------------------------------- ...

  4. 关于在linux中使用图形界面的网络管理工具

    有好几种自动设置的工具可以选择(既然说是自动设置的工具,那就说明有手动设置的工具,例如 使用 ip, iw, iwconfig 这些命令设置网络),例如:Connman, netctl, Networ ...

  5. 【转】Android各大发布市场

    前言 如果只有一个或者少许的两三个Android市场,本文也没用存在的必要性,本文谨献给同在Android奋战的同仁. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnbl ...

  6. 很久以前写的一个 ShareRestrictedSD 类

    代码中一开始的 几个 USES 单元,可能是多余的. unit ShareRestrictedSD; interface uses Windows, Messages, SysUtils, Class ...

  7. C# 自动Ping服务

    using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; u ...

  8. [已解决] git 重命名文件夹

    git mv oldfolder newfolder 原文地址:http://www.cnblogs.com/gifisan/p/5980608.html

  9. C# Winform中DataGridView绑定后DataGridViewCheckBoxColumn无法显示的问题

    在控件DataGridView绑定数据源后,发现DataGridViewCheckBoxColumn不能显示当前的check值.经过一番努力,现将完整代码奉献出来,仅供参考. 错误代码: /*禁止自动 ...

  10. eclipse安装Veloeclipse

    step 1.Help-->install new software-->Add Name:Veloeclipse Value:http://veloeclipse.googlecode. ...