使用头文件:#include <string.h>
定义:void *memmove( void* dest, const void* src, size_t count );
destinin:目标地址;
source:源地址;
count:复制的字节长度。
函数说明:memmove()复制 src 所指的内存数据的 n 个字节到 dest所指的内存地址上。也就是从源地址复制n 个字节到目标地址。如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
缓冲区重叠这个需要讲解一下:
根据dest(目标字符数组)
内存区域和src(源字符数组)
内存区域可分为三种情况:
- src内存区域和dest内存区域完全不重叠
src(源字符数组)
内存区域和dest(目标字符数组)
内存区域存在重叠 且dest所在区域在src所在区域前

如上图,dest(目标字符数组)
和src(源字符数组)
存在三个字节的内存区域重叠
但是在复制的时候,先把src的前三个字节复制到了dest的前三个内存区域内,再继续复制到重叠区域时,就算被覆盖,也不会有数据错误 所以这样可以正常复制
src(源字符数组)
内存区域和dest(目标字符数组)
内存区域存在重叠,且在dst所在区域在src所在区域后面

这时候如果使用memcpy()进行复制,会把三个重叠内存字节覆盖为src的前三个字节内容,导致复制到重叠部分的时候出现错误
如果使用memmove(),会先将src(源字符数组)
中的内容复制到缓冲区,然后再复制到dest(目标字符数组)
中去,有效的避免了数据重叠。
下面举一个例子:
首先定义一个字符串str:memmove can be very useful......
然后把字符串的第15个字节~第25个字节的11个字节数据,复制到第20个字节~第30个字节中去
src(源字符数组)
:very useful
dest(目标字符数组)
:useful.....
重叠部分: 第20个字节~第25个字节
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
system("pause");
return 0;
先将11个字节的src(源字符数组)
数据(very useful
)内容复制到缓冲区中,再用缓冲区中的内容覆盖dest(目标字符数组)
指向的内存(第20个字节~第30个字节),这样就避免了第20个字节~第25个字节的重叠

最后就变成了memmove can be very very useful.
头文件:#include <string.h>定义函数:char *strcpy(char *dest, const char *src);函数说明:strcpy()会将参数src 字符串拷贝至参数dest 所指的地址。返回值:返回参数dest 的字符串起始地址。
#include
char *str_contact(const char *,const char *);
char *str_contact(const char *str1,const char *str2)
char *result = (char*) malloc(strlen(str1) + strlen(str2) + 1);
if(!result)
printf(Er
void strmncpy(char *s, int m, int n, char *t);
参数 s 指向源字符串,t 指向字符串复制的目标单元,函数功能为将 s 指向字符串从第 m 个(从0开始编号)字符开始的连续 n 个字符复制到 t 指向的存储单元;
如果第 m 个字符后面的字符数不足 n 个,则复制到 ‘\0’为止;
如果 s 的长度不到 m,则复制空串。
char *s = "abcdefghijklmn";
snprintf
sprintf不能检查目标字符串的长度,可能造成众多安全问题, snprintf是的sprintf的安全版本,他的特点是安全,不管怎么着,它都能保证结果串str以\0结尾,哪怕dst_size不够大,它都能做好截断,同时在末尾添加上\0。
int snprintf(char *str, size_t size, const char *format, ...);
函数说明:
最多从源串中拷贝size-1个字符到目标串中,然后再在后面加一个0。所以如果目标串的大小为size的话,将不会溢出
1.strcpy()函数
原型声明:char strcpy(char dest, const char *src);功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
2.strcpy_s()
_s函数是微软自己加的, 不是标准库, 最直观
1.1、strcpy 函数原型char *strcpy(char *dest, const char *src)
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况,所以在实际使用一定要注意dest的空间一定要大于strlen(src)+1,最后有一个结束符‘\0’
1.2、strncpy 函数原型char *strncpy(char *dest, const char *src, size_t n)
把 src所指向的字符串
C++类用三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。
复制构造函数
复制构造函数是什么
复制构造函数首先是一个构造函数,它同所有其他的构造函数一样与类同名,没有返回值。它有一个的参数,是该类类型的引用(一般将它声明为const,源于用于赋值的对象一般不用改变它本身的值)。于是复制构造函数的原型为:
class BOOK
public:
BOOK(const BOOK& rhs); //构造函数一
BOOK(string &
void fgo(char c[],char d[]);
char a[]="听我说谢谢你~",b[]="你要结婚啦~";
printf("a=%s\n",a);printf("b=%s\n",b);
printf("将a复制到b:");
fgo(a,b);
printf("\na=%s\n",a);printf("b=%s\n",b);
void fgo(char c[],char.