把最近应用比较多的关于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。