strcpy拓展

一个标准的strcpy函数:

原本以为自己对strcpy还算比较了解,结果面试时还是悲剧了。

下面给出网上strcpy的得分版本:

2

void strcpy( char *strDest, char *strSrc )
{
  while( (*strDest++ = * strSrc++) != '\0’ );
}


  4

void strcpy( char *strDest, const char *strSrc ) 
//将源字符串加const,表明其为输入参数,加2
{
  while( (*strDest++ = * strSrc++) != '\0’ );
}


  7

void strcpy(char *strDest, const char *strSrc) 
{
 //对源地址和目的地址加非0断言,加3
 assert( (strDest != NULL) && (strSrc != NULL) );
 while( (*strDest++ = * strSrc++) != '\0’ );
}


  10

//为了实现链式操作,将目的地址返回,加3分!

char * strcpy( char *strDest, const char *strSrc ) 
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *address = strDest; 
 while( (*strDest++ = * strSrc++) != '\0’ ); 
  return address;
}

关键是:

为了实现链式操作,将目的地址返回

这句是个神马回事,我的面试题就是:

strcpy函数返回值有神马作用?

结果彻底悲剧了,尼玛确实不知道。

先来看看微软的代码:

char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;
        while( *cp++ = *src++ )
                ;               /* Copy src over dst */
        return( dst );
}
发现微软的代码很简单,bug一堆是吧?但是 return( dst );到底有神马作用?

考虑:

int length = strlen( strcpy(str, “Hello World”) );
你就能发现奥秘了。为了实现链式操作,将目的地址返回  原来说的就是这么一会事:

Strcpy函数可以作为另外一个函数的实参。

一个标准的strcpy函数:

原本以为自己对strcpy还算比较了解,结果面试时还是悲剧了。

下面给出网上strcpy的得分版本:

2

void strcpy( char *strDest, char *strSrc )
{
  while( (*strDest++ = * strSrc++) != '\0’ );
}


  4

void strcpy( char *strDest, const char *strSrc ) 
//将源字符串加const,表明其为输入参数,加2
{
  while( (*strDest++ = * strSrc++) != '\0’ );
}


  7

void strcpy(char *strDest, const char *strSrc) 
{
 //对源地址和目的地址加非0断言,加3
 assert( (strDest != NULL) && (strSrc != NULL) );
 while( (*strDest++ = * strSrc++) != '\0’ );
}


  10

//为了实现链式操作,将目的地址返回,加3分!

char * strcpy( char *strDest, const char *strSrc ) 
{
 assert( (strDest != NULL) && (strSrc != NULL) );
 char *address = strDest; 
 while( (*strDest++ = * strSrc++) != '\0’ ); 
  return address;
}

关键是:

为了实现链式操作,将目的地址返回

这句是个神马回事,我的面试题就是:

strcpy函数返回值有神马作用?

结果彻底悲剧了,尼玛确实不知道。

先来看看微软的代码:

char * __cdecl strcpy(char * dst, const char * src)
{
        char * cp = dst;
        while( *cp++ = *src++ )
                ;               /* Copy src over dst */
        return( dst );
}
发现微软的代码很简单,bug一堆是吧?但是 return( dst );到底有神马作用?

考虑:

int length = strlen( strcpy(str, “Hello World”) );
你就能发现奥秘了。为了实现链式操作,将目的地址返回  原来说的就是这么一会事:

Strcpy函数可以作为另外一个函数的实参。

猜你喜欢

转载自blog.csdn.net/qq_33531400/article/details/53821830