其实当初就是随便用用,最近找实习,被问起来,还让写strcpy原型,好久没动了,就索性一块看看
两者区别
strcpy只能拷贝字符串,memcpy还能拷贝其他的
strcpy遇到 '\0' 拷贝结束(拷贝时将'\0’带过去),memcpy拷贝时带有长度参数
头文件
#include
#include//两者都可以
strcpy函数原型
char *strcpy(char* dest,const char* src)
{
assert((strDest!=NULL) && (strSrc !=NULL)); //如果两个为空则,直接中止
char* res = dest;
while((*dest++ = *src++) != '\0')
return res;
}
strcpy实例1,,从小串拷贝到大串
其实strcpy复制过去是带字符串结束符 ‘\0’的
int main()
{
char a1[] = "123456789";//sizeof(a1):10, strlen(a1):9
char a2[] = "abcd";
strcpy(a1, a2);//将字符数组a2拷贝到 数组a1中,
cout << "a1:" << a1 << endl;//输出:abcd
cout << "a2:" << a2 << endl;//输出:abcd
cout << "sizeof(a1):" << sizeof(a1) << endl;//输出:10
cout << "strlen(a1):" << strlen(a1) << endl;//输出:4
//输出:abcd 6789 (中间一个空格为'\0') 环境为Dev C++
for (int i = 0; i < sizeof(a1); i++)
cout << a1[i];
return 0;
}
在VS2013中输出的结果不同,以上执行拷贝后输出abcd 后面的全部都为空格,并且在VS2013中,用strcpy会提示错误,让用strcpy_s代替strcpy函数。
strcpy实例二:大串拷贝到小串
char a2[] = "123456789";//将a1、a2互换之后
char a1[] = "abcd";
//将字符数组a2(123...789)拷贝到 数组a1(abcd)中,
strcpy(a1, a2);
cout << "a1:" << a1 << endl;//输出:123456789
cout << "a2:" << a2 << endl;//输出:123456789
cout << "sizeof(a1):" << sizeof(a1) << endl;//输出:5
cout << "strlen(a1):" << strlen(a1) << endl;//输出:9
//输出:12345,如果将sizeof(a1)加上4,输出:123456789
for (int i = 0; i < sizeof(a1)+4; i++)
cout << a1[i];
实例二在Dev中可以运行,在VS2013中不可以运行(即使将strcpy改成strcpy_s运行时也出错)
实际环境中使用
在实际环境中,无论是用strcpy还是strcpy_s函数时,都需要留一个字符串结束的空间,如string的拷贝构造函数。
String::String(const char *str)
{
if(str == NULL){//为空,分配一个空间存放结束符
m_data = new char;
*m_data = '\0';
}
else
{
int length = strlen(str);//算上\0
m_data = new char[length+1];
strcpy_s(m_data, len+1,str); //将str中字符串复制到m_data,最后一个空间为'\0'结束符
//strcpy(m_data,str);//或者用strcpy
}
}
memcpy函数
函数原型
void *memcpy(void*dest, const void *src, size_t n);
dest 目的字符串
src 原字符串
n 拷贝的字节数,常为sizeof(xxx)
具体用法
void memcpyTest()
{
int a[] = { 1, 2, 3, 4, 5, 6 };
int b[] = { 10, 11, 12 };
//memcpy(a, b, sizeof(b));//如果 sizeof(b) 写成3,就只能将数字10拷贝过去(0-3)
//printArray(a, sizeof(a)/4);//输出:10,11,12,4,5,6,
//memcpy(a, b, sizeof(a));//以a数组的长度,b数组的内容
//printArray(a, sizeof(a) / 4);//输出:10,11,12,-85899324,-85899324,1,
//memcpy(a, a + 1, sizeof(a));//取全部数据拷贝
//printArray(a, sizeof(a) / 4);//输出:2,3,4,5,6,-85893460,
/*
a+1:地址为2所在的地址,2,3,4,5,6
取前三个(2,3,4)替换原来的前三个(1,2,3)
得到:2,3,4,4,5,6
*/
//memcpy(a, a + 1, sizeof(b));//取一部分数据拷贝 len(b)