`
蒙面考拉
  • 浏览: 161193 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自己实现strcpy()以及memcpy()

 
阅读更多

char *strcpy(char *strDest, const char *strSrc);

{

    assert((strDest!=NULL) && (strSrc !=NULL)); // 2

    char *address = strDest;                   // 2

    while( (*strDest++ = * strSrc++) != \0 )    // 2

       NULL ;

    return address ;                          // 2

}

恰好昨天在CSDN上看到一个帖子讨论strcpy(); 
对其中相关的内容做了一点解释:
void test1()
{
int i;
char string[10];
char *str1="0123456789";
strcpy(string, str1); // 字符越界?
/*
错误:
strcpy(desc,src),
当src<=desc时, 如 char *str1="012345678",长度为10,
则string得到合理值,并且string[9]='\0';
当src>desc时,如  char *str1="0123456789",长度为11,
则string得到0-9的值,string[9]='9',
虽然可以运行,但string[9]后面的一个不属于string的字符
被恶意修改为‘\0',这不是我们想要的,也可能造成严重后果。
*/
printf("%s\n",string);
for(i=0;i<11;i++)//故意循环11次,查看最后一个被无意修改的字节;
{
    printf("%c\t%d\n",string[i],string[i]);
}
printf("\n");
}

void test2()
{
int i;
char string[100], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
/*
strcpy(desc,src)
会把src 视为string类型,拷贝时查找'\0'结束符,作为scr的结束,来付给desc;
所以,本程序虽然能够运行,但潜在的问题:
str1的所有10个元素被初始化为'a',但后续的字符是不可预料的,
直到”偶然“碰到了'\0',才停止识别str1;
如果string是个100个元素的大数组,则会发现str1后面的"随机元素"也被复制给了string
直到碰到'\0'
说"偶然",加引号,其实'\0'在未知内存中还是挺多的。呵呵
当然,如果desc是string[10]的话,也就会掐掉str1后面的东东,这就是表面上的运行正确;
*/
printf("%s\n",string);
for(i=0;i<100;i++)
{
    printf("%c\t%d\t%c\n",string[i],string[i],str1[i]);//对比来看;
}
printf("\n");
}

也就是说,如果str1没有'\0'来表示结束,则,strcpy不能成功执行.

memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。

与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束
memcpy()的实现
难点:1.指针类型的变换
         2.要防止内存拷贝时的相互覆盖
#include <iostream>
#include "assert.h"
using namespace std;

void* memcpy(void* dest,const void* source,int lengh)
{
    assert((dest!=NULL)&&(source!=NULL));    //断言
  if(dest < source)
    {
        char* cdest = (char*)dest;
        const char* csource = (char*)source;
        for(int i=0;i<lengh;i++)
            *cdest++ = *csource++;
  return cdest;
    }
    else
    {
        char* cdest = (char*)(dest)+lengh-1;
        char* csource = (char*)(source)+lengh-1;
        for(int i=0;i<lengh;i++)
            *cdest-- = *csource--;
  return cdest;
    }
   
}

int main()
{
    char* a = "he\0llo";
    char b[10];
 memcpy(b,a,10);
 for(int k=0;k<6;k++)
  cout << b[k] <<endl;
    return 0;
}


输出:
h
e

l
l
o
=======================================

分享到:
评论

相关推荐

    常用函数的实现strcpy,memcpy,memmove,strcat,strcmp原型

    本文将深入解析五个常用的C语言函数:`strcpy`、`memcpy`、`memmove`、`strcat`和`strcmp`的实现原理与功能特性,这些函数在处理字符串复制、连接、比较以及内存拷贝时扮演着关键角色。 ### 1. `strcpy` - 字符串...

    strcpy与memcpy的区别-.pdf

    其中,strcpy和memcpy是两个常用的函数,虽然它们都用于复制内存中的数据,但它们的功能、使用场景以及操作方式有着明显的区别。 首先,strcpy函数是C标准库中的一个字符串处理函数,其原型为`char *strcpy(char *...

    strcpy与memcpy的区别-.docx

    在C语言和C++中,`strcpy`和`memcpy`都是用于复制内存区域的函数,但它们在使用场景和操作方式上存在显著的区别。这里我们将深入探讨这两个函数的工作原理、适用情况以及潜在的安全隐患。 首先,`strcpy`是C标准库...

    C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识。 1、strcpy和strncpy函数 这个不陌生,大一学...

    深入理解strcpy与memcpy的区别

    深入理解`strcpy`与`memcpy`的区别是C语言编程中非常关键的一个知识点,尤其是在处理内存复制操作时。这两个函数都是C标准库中的成员,但它们的功能和使用场景有所差异。 `strcpy`函数专用于字符串复制。它的原型为...

    memcpy和strcpy源码

    网上参考资料写的memcpy以及strcpy的源码,希望能帮助大家。

    memcpy 和strcpy 的区别

    memcpy 和 strcpy 的区别 memcpy 和 strcpy 都是标准 C 库函数,都是用于从一块内存复制一段连续的数据到另一块内存,但是它们之间存在一些关键的区别。 首先,strcpy 函数用于复制字符串,它从源字符串的起始地址...

    安全函数strcpy_s、strncpy_s、snprintf_s、memcpy_s

    传统的C语言函数如`strcpy`, `strncpy`, `sprintf`, 和 `memcpy`虽然功能强大,但它们缺乏对缓冲区溢出的安全检查,这可能导致严重的安全漏洞。为了解决这个问题,C标准库引入了安全版本的这些函数,例如`strcpy_s`,...

    strcpy,sprintf,memcpy的区别,Sizeof与Strlen的区别.docx

    本文将详细解析strcpy、sprintf、memcpy这三个函数的区别,以及sizeof和strlen这两个操作的区别。 首先,strcpy是一个专门用于字符串拷贝的函数,它从源字符串复制内容到目标字符串,直到遇到终止符'\0'为止。例如...

    25_strcpy_strncpy_memcpy的区别1

    因此,`memcpy`在处理非字符串数据或者已知大小的内存块时非常有用,但同样需要注意避免源和目标缓冲区的重叠,以及确保目标缓冲区有足够的空间。 在实际编程中,为了确保安全,应谨慎使用`strcpy`,优先考虑使用`...

    memset,memcpy,strcpy 的用法

    memset,memcpy,strcpy 的用法,详细区别还有优缺点对比!

    Memset、Memcpy、Strcpy 的作用和区别

    Strcpy用于字符串拷贝,重点在于字符串的复制以及包含字符串结束符'\0'。正确使用这三个函数,需要根据实际的应用场景和要求来选择合适的函数进行内存操作。在涉及到安全性和效率的场合,比如嵌入式系统编程或单片机...

    strcpy 解析,很有用

    本文将重点解析`strcpy`函数的功能、实现方式及其潜在问题,并通过具体的代码示例来加深理解。 #### strcpy简介 `strcpy`函数的主要作用是从源字符串复制内容到目标字符串。其原型定义通常如下: ```c char *...

    strcpy,sprintf,memcpy的区别,Sizeof与Strlen的区别.pdf

    本文将深入探讨`strcpy`、`sprintf`、`memcpy`这三种函数的区别以及`sizeof`和`strlen`的区别与联系。 首先,让我们来看`strcpy`、`sprintf`和`memcpy`的区别。这三个函数都是用于数据的复制,但它们的使用场景和...

    浅析C++中memset,memcpy,strcpy的区别

    在C++编程中,`memset`, `memcpy`, 和 `strcpy` 是三个经常使用的函数,用于处理内存区域的数据操作。它们各自有不同的用途和特点,本文将深入解析它们的区别。 `memset` 函数是用来设置一块内存区域的值。其原型为...

    strEX.rar_memcpy_strcpy

    void memsetEX(unsigned char *dst,unsigned char val,unsigned char len); void memcpyEX(unsigned char *dst,unsigned char *src,unsigned char len); unsigned char memcmpEX(unsigned char *dst,unsigned char...

    memmove、memcpy和memccpy简介.docx

    strcpy、memcpy、memmove 和 memset 四个函数都是用于字符串和内存操作的,但是它们之间有一些区别: * strcpy 函数用于字符串拷贝,但是它不知道拷贝的字节数目,它会一直拷贝直到遇到字符串结束符 '\0'。 * ...

    memcpy 函数.pdf

    下面我们将详细探讨`memcpy`函数的使用、特点以及与其他函数的比较。 ### 函数原型 `memcpy`函数的原型定义如下: ```c void *memcpy(void *dest, const void *src, size_t n); ``` 参数解释如下: 1. `dest`:...

Global site tag (gtag.js) - Google Analytics