自己实现strcpy函数

来源:互联网 发布:网络用语py什么意思 编辑:程序博客网 时间:2024/06/05 10:04

问题描述:

自己实现一个MyStrcpy函数,要和C语言库函数的strcpy函数完成同样的功能。

问题分析:
首先我们要了解一下atoi函数它到底做了什么事情

(1) 函数原型
char *strcpy(char *dest, const char *src);

(2) 函数说明

dest 为目标字符串指针,src 为源字符串指针,该函数把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。

(3) 返回值
成功执行后返回目标数组指针 dest。

PS:
如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。

根据以上的描述,我们可以来实现自己的代码了

参考代码:

#define  _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>char* MyStrcpy1(char* dst, const char* src)//这种方案在大多数情况下是可以的,但是在内存重叠的情况下就会有问题{    if (dst == NULL || src == NULL)        return NULL;    if (dst == src)        return dst;    char *pTemp = dst;    while ((*dst++ = *src++) != '\0');    return pTemp;}int MyStrlen(const char *pStr){    int nLen = 0;    if (NULL == pStr)        return 0;    while (*pStr++ != '\0')        nLen++;    return nLen;}char * MyStrcpy2(char *dst, const char *src)//考虑内存重叠的情况,需要倒过来拷贝{    if (dst == NULL || src == NULL)        return NULL;    if (dst == src)        return dst;    char *ret = dst;    int nLen = MyStrlen(src);    dst = dst + nLen;    src = src + nLen;    int nLoop = nLen + 1;    while (nLoop--)    {        *dst = *src;        src--;        dst--;    }    return ret;}int main(){    char str1[100] = "dcbaefad";    char str2[100];    printf("情况1:无内存重叠的情况\n");    //strcpy(str2, str1);    //MyStrcpy1(str2, str1);    MyStrcpy2(str2, str1);    printf("%s\n", str2);//对于无内存重叠的情况三个函数都是可以的    printf("情况2:有内存重叠的情况\n");    //strcpy(str1 + 1, str1);    //MyStrcpy1(str1 + 1, str1);    MyStrcpy2(str1 + 1, str1);    printf("%s\n", str1);    //对于有内存重叠的情况,MyStrcpy1会崩溃,之所以会崩溃是因为程序陷入了死循环永远结束不了,直到遇到不可写内存导致崩溃    return 0;}

运行结果:

这里写图片描述