您的位置:首页 > 其它

About memset应用、memcpy和strcpy比较

2013-11-22 09:34 281 查看
       把最近应用比较多的关于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 memcpy memset strcpy