C/C++ memcpy/strcpy/strcpy_s区别

最后更新于:2020-08-04 23:28:49

一.memcpy/strcpy/strcpy_s简介

strcpy_s函数和strcpy函数的功能几乎是一样的。strcpy函数,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。在程序运行时,这将导致不可预料的行为。用strcpy_s就可以避免这些不可预料的行为。

strcpy_s函数strcpy函数属于字符串拷贝,在拷贝过程中遇到\0,拷贝结束;而memcpy函数属于内存拷贝,即便拷贝过程中遇到\0,还是会继续拷贝;

二.memcpy/strcpy/strcpy_s实战

1.strcpy_s函数和strcpy函数对于拷贝结束之后的字符串默认会加上\0(遇到\0结束拷贝 )

/************************************************************************/
/*@文件名      : strcpy/strcpy_s.cpp
/*@日  期      : 2020/07/03 21:52
/*@作  者      : 猿说编程
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 -strcpy/strcpy_s函数完成字符串拷贝
/************************************************************************/

char a[5];
char b[5];
//strcpy_s(a, 4,"hell"); 崩溃,实际上需要拷贝的是6个字符
//strcpy_s(a, strlen("hell"), "hell"); //strcpy_s(a, 4,"hell"); 崩溃,strlen没有计算‘\0’
//strcpy_s(a, 5,"hell0"); 崩溃

strcpy_s(a, strlen("hell")+1, "hell"); //ok
strcpy_s(a, 5, "hell");//ok
cout<< a << endl; 

输出结果:

hell
请按任意键继续. . .

2.memcpy函数不会对拷贝结束之后的字符串加上\0(内存拷贝,任何字符都能拷贝)

/************************************************************************/
/*@文件名      : strcpy/strcpy_s/memcpy.cpp
/*@日  期      : 2020/07/23 21:52
/*@作  者      : 猿说编程
/*@公众号      : 猿说编程
/*@博客        : www.shuopython.com
/*@描述        : C语言教程 -strcpy/strcpy_s/memcpy函数完成字符串拷贝
/************************************************************************/


//案例一:输出结果乱码
char a[5];
memcpy(a, "hello", 5); //直接拷贝了5个字符,并没有拷贝'\0' 
cout << a << endl;

/*
输出结果:
hello烫烫烫?请按任意键继续. . .
*/

//案例二:输出结果正常
char a[5];
memcpy(a, "hel", 5); //直接拷贝了5个字符,直到字符串结束,连'\0'一起拷贝
cout << a << endl;

/*
输出结果:
hel
请按任意键继续. . .
*/


猜你喜欢

1. 三目运算符

2. 逗号表达式

3. char和wchar_t相互转换

4. sizeof和strlen函数区别

5. unicode和多字节区别




转载请注明: 猿说编程 » C/C++教程 » memcpy/strcpy/strcpy_s区别



技术交流、商务合作请直接联系博主
扫码或搜索:猿说编程

python/C++教程

猿说编程
微信公众号 扫一扫关注

赞赏

微信赞赏支付宝赞赏