0
点赞
收藏
分享

微信扫一扫

strcpy源码实现与测试


strcpy和memcpy的区别
strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。

已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );

char * strcpy(char * dest, const char * src) // 实现src到dest的复制
{
  if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性
  {

      return NULL;
  }
  char *strdest = dest; //保存目标字符串的首地址
  while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下
  return strdest;
}
void *memcpy(void *memTo, const void *memFrom, size_t size)
{
  if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
return NULL;
  char *tempFrom = (char *)memFrom; //保存memFrom首地址
  char *tempTo = (char *)memTo; //保存memTo首地址
  while(size -- > 0) //循环size次,复制memFrom的值到memTo中
  *tempTo++ = *tempFrom++ ;
  return memTo;
}
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy



第一种方法是最好的源码,后面两种是有问题,大家可以用不同长度的字符串进行测试。

#include <iostream>
#include <assert.h>
using namespace std;
int main()
{
char *mystrcpy(char *strDest, char *strSrc);
char *str1=new char ()/*(char*)malloc(100)*/;
char *str2=new char ();
cin>>str2;
mystrcpy(str1,str2);
cout<<str1;
return 0;
}



char *mystrcpy(char *strDest, char *strSrc)
{
assert((strSrc !=NULL) && (strDest!=NULL));
char *dest=strDest;
while ((*strDest++ = *strSrc++ ) != '\0')
{
NULL;
}
return dest;
}

//char *mystrcpy(char *strDest, char *strSrc)
//{
// assert((strSrc !=NULL) && (strDest!=NULL));
// char *dest=strDest;
// while( *strSrc!='\0')
// *strDest++ = *strSrc++;
// return dest;
//}

//char *mystrcpy(char *strDest, char *strSrc)
//{
// assert((strSrc !=NULL) && (strDest!=NULL));
// char *dest=strDest;
// for( ;*strSrc!='\0';)
// *strDest++ = *strSrc++;
//
// return dest;
//}

strcpy源码实现与测试_c++

在the c program一书中有两个版本的:

/* strcpy: copy t to s; array subscript version */
void strcpy(char *s, char *t)
{
int i;
i = 0;
while ((s[i] = t[i]) != '\0')
i++;
}

/* strcpy: copy t to s; pointer version */
void strcpy(char *s, char *t)
{
int i;
i = 0;
while ((*s = *t) != '\0')
{
s++;
t++;
}
}


/************************************************************************
strcopy函数
************************************************************************/
/* copy: copy 'from' into 'to'; assume to is big enough (the c programming)*/
void mystrcpy1(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
{
++i;
}
}

/* copy: specialized version(the c programming) */
void mystrcopy2(void)
{
int i;
extern char line[], longest[];
i = 0;
while ((longest[i] = line[i]) != '\0')
++i;
}

void mystrcpy3(char * dest, const char * src)
{
int i=0;
for(; *(src+i)!='\0'; i++)
*(dest+i) = *(src+i);
*(dest+i) = '\0';
}

/* strcpy: copy t to s; array subscript version---the c programming一书中 */
void mystrcpy4(char *s, char *t)
{
int i;
i = 0;
while ((s[i] = t[i]) != '\0')
i++;
}

/* strcpy: copy t to s; pointer version ---the c programming一书中*/
void mystrcpy5(char *s, char *t)
{
int i;
i = 0;
while ((*s = *t) != '\0')
{
s++;
t++;
}
}
/*常见一种写法*/
char *mystrcpy6(char *strDest, const char *strSrc)
{
assert((strSrc !=NULL) && (strDest!=NULL));
char *dest=strDest;
while ((*strDest++ = *strSrc++ ) != '\0')
{
NULL;
}
return dest;
}

/*the c programming一书中原始的写法*/
void mystrcpy7(char *s, char *t)
{
while (*s++ = *t++)
;
}







举报

相关推荐

0 条评论