一,strcpy()
char *strcpy(char *dest, const char *src){
if ((src == NULL) || (dest == NULL)){
return NULL;
}
char *temp = dest;
while (*strSrc != '\0'){
*strDest ++ = *strSrc ++;
}
return temp;
}
二,memcpy()
void *memcpy(void *dest,const void *src, size_t count){
if(dest == NULL || src == NULL){
return NULL;
}
char *pDest = static_cast<char*>(dest);
const char *pSrc = static_cast<const char*>(src);
int i = 0;
while (i < count){
*pDest ++ = *pSrc ++;
i ++;
}
return dest;
}
三,strcpy与memcpy之间的区别
(1)复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型数组等。
(2)复制的方法不同。strcpy不需要指定长度,它遇到串结束符"\0"就结束,所以容易溢出,例如:dest的长度为5,而src的长度为10,复制的时间dest就会溢出,也就是dest越界了。memcpy则是根据其第3个参数决定复制的长度。
(3)用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
四,memset()
函数声明:
void *memset(void *s, char ch, unsigned n)
函数用法:
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,并且通常初始化为0或者字符'\0'。
应用举例:
struct Student{
int age;
string name;
};
int main(){
//对字符数组进行初始化
char str[20];
memset(str, '\0', sizeof(str));
//对整数数组进行初始化
int nums[20];
memset(nums, 0, sizeof(nums) * sizeof(int));
//对结构体进行初始化
Student zhangsan;
memset(&zhangsan, 0, sizeof(Student));
return 0;
}
注意:
(1)memset的第一个参数已经有了被初始化空间的首地址,为什么还要返回一个void*的指针去指向这个地址呢?这种结构在很多函数库里面比较常见,这里之所以还要返回这个指针是为了实现链式编程。
(2)一定要注意,memset是按照字节对空间进行初始化的,也就是说,函数里面的第二个参数的那个初值(一般为0)是按照一个一个字节往第一个参数所指区域赋值的,所以,对于单字节数据类型(char)可以初始化为任意支持的值,但是对于非多字节数据类型只能初始化为0,而不能初始化成别的初值。
五,自定义memset函数
void *memset(void *s, char ch, unsigned n){
if(s == NULL){
return NULL;
}
char *str = (char*)(s);
int length = sizeof(str);
int minValue = length > n ? n : length;
int i = 0;
while(i < minValue){
*str ++ = ch;
i ++;
}
return s;
}