About memset应用、memcpy和strcpy比较


       把最近应用比较多的关于string的操作函数做一下总结。

       一、首先说一下memset,在很多类和结构体中都会用到它来做初始化,比较好用。

 函数原型:void memset(void* s,char ch,size_t n)

 函数解释:把s中的前n个字节用ch替换并且返回s

 作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快的方法。

 需要的头文件 C++ #include <string>

 如最简单的结构体内初始化:

struct tData
{
    int nData;
    char  szData[255];
    tData()
    {
        memset(tData,0,sizeof(tData));
    }
}


 

也可以用做数组进行清零操作:

struct tObj
{
   int nNumber;
   int nData;
   int ntpye;
};
int _tmain(void)
{
   //不可作用指针,可能会引起访问冲突,char* pszStr指向不可写空间?
    //用于结构体、类等对象的初始化,很方便!
   char szStr[] = "this is a test!\n";
	
   printf("szStr : %s\n",szStr);
	
   char szStr1[10];

   memset(szStr1,0,10);
	
   printf("szStr1 :%s\n",szStr1);

   memset(szStr,'1',6);

   printf("szStr : %s\n",szStr);

   tObj Test[10];
   memset(Test,0,sizeof(tObj)*10);
   printf("Test : %d %d %d\n",Test[0].nData,Test[0].nNumber,Test[0].ntpye);

   tObj _Obj;
   printf("Test : %d %d %d\n",_Obj.nData,_Obj.nNumber,_Obj.ntpye);
   memset(&_Obj,0,sizeof(tObj));
   printf("Test : %d %d %d\n",_Obj.nData,_Obj.nNumber,_Obj.ntpye);
   getchar();
   return 0;
}


 

        二、关于字符串strcpy和memcpy

函数原型:void *memcpy(void *dest, const void *src, size_t n);

函数解释:从源src中所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。

函数返回值:指向dest的指针

作用:memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制。

函数执行:

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; 
}


简单操作示例:

int _tmain(int argc, _TCHAR* argv[])
{
    char szData[] = "This is a test!";
    char szTemp[30];
    memset(szTemp,'1',29);
    szTemp[30] = '\0';                 //字符串没有结束符,效果很happy,可以去掉它试一试
    memcpy(szTemp,szData,10);

    printf("%s",szTemp);
    getchar();
    return 0;
}

 

 

关于strcpy函数原型:char* strcpy(char* dest,const char* src);

函数解释:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。

返回值:dest的指针

函数典型

{
   char* pszDestCpy = pszDest;
   while( (*pszDest++ = *pszSrc++) != '0');
   return pszDestCpy;
}

strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。

因此内部函数需要判断

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; 
} 

strcpy和memcpy主要有三方面的不同:

1、复制的内容不同,strcpy只复制字符串,memcpy复制的范围比较广,例如字符数组、整型、结构体、类等。

2、复制的方法不同,strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以很容易溢出。memcpy根据他的第三个参数决定复制的长度。

3、用途不同,一般字符串复制用strcpy,其他复制用memcpy。


 

 
 
 
 
 
 

你可能感兴趣的:(String,memset,memcpy,strcpy)