c/c++拷贝函数
memcpy()函数
- 概要
| 原型 | |
| 功能 | memcpy()会复制 src 所指的内存内容的前 num 个字节到 dest所指的内存地址上(memcpy()并不关心 被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据 类型进行复制) |
| 注意 | 1.dest 指针要分配足够的空间,也即大于等于 num字节的空间。 3.memcpy拷贝结束后不会给dest末尾添加‘/0’
src的长度都不会阻止),在vs2022会报警告。 |
| 返回值 | 返回指向 dest 的指针。注意返回的指针类型是void*,使用时一般要进行强制类型转换。 |
- 举个例子
int main() { const char* p1 = "HEllO"; char* p2 = (char*)malloc(sizeof(char) * 10); char* p3 = (char*)memcpy(p2, p1, 6); cout << p3 << endl; }memmove函数
- 概要
| 原型 | |
| 功能 | memmove()会复制 src 所指的内存内容的前 num 个字节到 dest所指的内存地址上 |
| 注意 | 1.memmove() 更为灵活,当src 和 dest所指的内存区域重叠时,memmove() 仍然可以正确的处理, 不过执行效率上会比使用 memcpy()略慢些。(处理方式就是如果src长度小于dest,就从头开始复制 ,如果src长度大于dest,就从后往前复制,这样就可以保证内存区域重叠时正确复制) 2.memmove的特性基本上和memcpy一致。 |
| 返回值 | 返回指向 dest 的指针。注意返回的指针类型是void,使用时一般要进行强制类型转换 |
- 举个例子
int main() { char str[] = "memmove can be very useful......"; memmove(str + 20, str + 15, 11); puts(str); return 0; }strcpy()函数
- 概要
| 原型 | |
| 功能 | strcpy() 把src所指的由"/0"结束的字符串复制到dest 所指的数组中,返回指向dest 字符串的起始地址 (连同"/0") |
| 注意 | 1.如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(bufferOverflow)的错误情况,在编写 程序时需要特别留意,或者用strncpy()来取代
崩溃 3.不能正确处理内存重叠的情况 |
| 返回值 | 指向dest 字符串的起始地址 |
- 举个例子
int main() { char str1[] = "Sample string"; char str2[8]; char str3[40]; strcpy(str2, str1); strcpy(str3, "copy successful"); printf("str1: %s\nstr2: %s\nstr3: %s\n", str1, str2, str3); return 0; }strcat函数(字符串连接)
- 概要
| 原型 | |
| 功能 | 将一个字符串(src)追加到另一个字符串(dst)的末尾(包括‘/0’) |
| 注意 | 1.strcat没有strcpy效率高,因为它需要先找到dest指向的字符串的‘/0’的位置 2.不处理内存重叠的问题。 |
| 返回值 | 返回dest |
- 举个例子
int main() { char* dest = new char[10] {"assss"}; strcat(dest,"dddddddd"); cout << dest << endl; }strncpy()函数
- 概要
| 原型 | |
| 功能 | strncpy()会将字符串src前n个字符拷贝到字符串dest,n也表示最多复制n个字符。 |
| 注意 | 1.不像strcpy(),strncpy()不会向dest追加结束标记'\0',这就引发了很多不合常理的问题。 2.如果n大于src的长度,会用"/0"填充dest。 3.不能正确处理内存重叠的情况 |
| 返回值 | 指向dest 字符串的起始地址 |
- 举个例子
int main(void) { char dest3[100] = "xxxxxxxxxxxxxxxxxxxxxxxxx"; const char src3[6] = "abcxy"; int n3 = 20; strncpy(dest3, src3, n3); return 0; }