编写一个标准strcpy函数

原创 2014年08月13日 07:51:10

1、如题,编写字符串的拷贝函数,下面就一些答案,分析出完美的解答。


2、strcpy实现1:

void MyStrcpy1(char *strDest, char *strSrc)
{
    if (strDest == NULL || strSrc == NULL)
    {
        return;
    }
 
    int i = 0;
 
    while (*(strSrc + i) != '\0')
    {
        *(strDest + i) = *(strSrc + i);
        i++;
    }
}

调用1:

int _tmain(int argc, _TCHAR* argv[])
{
    char str1[12] = {0};
    char str2[] = "abcdef";
 
    MyStrcpy1(str1, str2);
    printf("%s\n", str1);
 
    getchar();
    return 0;
}

结果1:正确



调用2:目的字符数组不初始化

int _tmain(int argc, _TCHAR* argv[])
{
    char str1[12];
    char str2[] = "abcdef";
 
    MyStrcpy1(str1, str2);
    printf("%s\n", str1);
 
    getchar();
    return 0;
}

结果2:错误



调用3:

int _tmain(int argc, _TCHAR* argv[])
{
    char str1[1] = {0};
    char str2[] = "abcdef";
 
    MyStrcpy1(str1, str2);
    printf("%s\n", str1);
 
    getchar();
    return 0;
}

结果3:错误



分析:这个函数写的应该比较清晰了,而且也考虑到了传入参数(指针)可能为空的情况,但是有以下几点问题:

(1)源字符串的末尾的'\0'没有拷贝到目标中,如果传入的strDest原来就是字符串,那么OK;但是如果传入的strDest只是一个字符数组的地址,或者说一块内存空间的地址(内存空间又未初始化为NULL),那么就会出问题了。

(2)传入的strSrc参数可能被更改,应加const限定。

(3)为了能够使用链式表达式,应该加上返回值(返回目的指针)。

(4)最好,能用断言,检测参数的合法性。


优化实现1如下:

char* MyStrcpy1(char *strDest, const char *strSrc)
{
    if (strDest == NULL || strSrc == NULL)
    {
        return strDest;
    }
 
    int i = 0;
    char *pCh = strDest;
 
    while (*(strSrc + i) != '\0')
    {
        *(strDest + i) = *(strSrc + i);
        i++;
    }
 
    *(strDest + i) = '\0';
 
    return pCh;
}

或用for循环:

char* MyStrcpy1(char *strDest, const char *strSrc)
{
    if (strDest == NULL || strSrc == NULL)
    {
        return strDest;
    }
 
    int i = 0;
    char *pCh = strDest;
 
    for (i = 0; *(strSrc + i) != '\0'; i++)
    {
        *(strDest + i) = *(strSrc + i);
    }
 
    *(strDest + i) = '\0';
 
    return pCh;
}

或直接用下标操作:

char* MyStrcpy1(char *strDest, const char *strSrc)
{
    if (strDest == NULL || strSrc == NULL)
    {
        return strDest;
    }
 
    int i = 0;
    char *pCh = strDest;
 
    for (i = 0; strSrc[i] != '\0'; i++)
    {
        strDest[i] = strSrc[i];
    }
 
    strDest[i] = '\0';
 
    return pCh;
}

最后,可以在最前面加上断言:

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

但是,assert只在Debug下有用,在Release下是无效的。


3、更进一步,因为strDest是指针而不是数组名,所以可以直接进行自增、自减运算:

char* MyStrcpy1(char *strDest, const char *strSrc)
{
    assert( (strDest != NULL) && (strSrc != NULL) );
 
    if (strDest == NULL || strSrc == NULL)
    {
        return strDest;
    }
 
    char *pCh = strDest;
 
    while (*strSrc != '\0')
    {
        *(strDest++) = *(strSrc++);
    }
 
    *strDest = '\0';
 
    return pCh;
}

这样,你会发现代码还可以精简:

char* MyStrcpy1(char *strDest, const char *strSrc)
{
    assert( (strDest != NULL) && (strSrc != NULL) );
 
    if (strDest == NULL || strSrc == NULL)
    {
        return strDest;
    }
 
    char *pCh = strDest;
 
    while (( *(strDest++) = *(strSrc++) ) != '\0')
    {
        NULL;
    }
 
    return pCh;
}


4、说明:

(1)vs2010中strcpy的定义如下:

/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
*       Copies the string src into the spot specified by
*       dest; assumes enough room.
*
*Entry:
*       char * dst - string over which "src" is to be copied
*       const char * src - string to be copied over "dst"
*
*Exit:
*       The address of "dst"
*
*Exceptions:
*******************************************************************************/
 
char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;
 
        while( *cp++ = *src++ )
                ;               /* Copy src over dst */
 
        return( dst );
}


(2)另外,关于函数中的assert和if判断,都是加强代码安全的一种手段,对于功能本身并不是必须的,assert出错表示发生了不该发生的事,这时就需要检查代码。另外,我们一直说在使用指针之前,要判断是否为空,这也是为了避免可能出现的错误。




版权声明:本文为博主原创文章,未经博主允许不得转载。

编写strcpy函数

五、编写strcpy函数(10分)已知strcpy函数的原型是       char *strcpy(char *strDest, const char *strSrc);       其中strD...
  • w122079514
  • w122079514
  • 2010年07月08日 20:45
  • 7194

请自己写出strcpy函数

char s[100]="1234";   strcpy(s+3,s);   printf("%s",s);  输出结果是1231234234  不理解这是为什么?  -----------...
  • jiyanfeng1
  • jiyanfeng1
  • 2012年11月12日 15:09
  • 3508

C/C++——strcpy函数的 几种 实现 和 详细 解析

C/C++——strcpy函数的实现 和解析 题目:      已知strcpy函数的原型是:          char * strcpy(char * strDest,const char * s...
  • wconvey
  • wconvey
  • 2014年03月13日 07:39
  • 28864

自己写的一个strcpy函数

自己写的一个strcpy函数,仅供参考: #include char* mystrcpy(char* dest,const char* src); int main() { char src...
  • Mr_warm
  • Mr_warm
  • 2012年11月30日 12:52
  • 1116

strcpy函数的实现

大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是: char *my_strcpy(char *dst,const char *src) { assert(ds...
  • Gpengtao
  • Gpengtao
  • 2012年04月15日 23:23
  • 84415

模拟实现strcpy函数

#define _CRT_SECURE_NO_WARNINGS  1 #include #include #include char* my_strcpy(char *dest, const c...
  • wangpengcsdn1
  • wangpengcsdn1
  • 2016年12月02日 23:16
  • 520

写程序实现自己的strcpy() 函数

函数 mystrcpy() 实现了strcpy() ,复制源字符串到目的串,返回一个指向目的串的指针 code #include char *mystrcpy(char *destinatio...
  • robinsongsog
  • robinsongsog
  • 2014年03月21日 18:38
  • 1251

不调用库函数,实现strcpy函数

      这是昨天淘宝一面的题目。      已经忘记当场写的函数是什么样子了,回来后想想写下了这样一段代码。char* strcpy(char *src, char *des){ if(src...
  • zzxian
  • zzxian
  • 2011年04月26日 16:54
  • 5690

字符串---不使用库函数,编写函数strcpy

一、问题描述已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。...
  • will130
  • will130
  • 2015年11月04日 20:39
  • 1234

strcpy()函数详解

strcpy()函数是C语言中的一个复制字符串的库函数,以下将详细解释说明一下: · 函数声明以及实现代码 char *strcpy(char *dst, const char *src);char ...
  • okawari_richi
  • okawari_richi
  • 2017年02月26日 14:17
  • 15282
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编写一个标准strcpy函数
举报原因:
原因补充:

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