1、strcpy函数
函数原型:char * strcpy( char * s2, const char * s1 );
头文件 #include <string.h>
这个函数把字符串s1复制到一分配好的字符串空间s2中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回s2,否则返回NULL。
缺陷:它最大的问题是strcpy并不检查目的缓冲区的大小边界,而是将源字符串逐一的全部赋值给目的字符串地址起始的一块连续的内存空间,同时加上字符串终止符。依据”\0”作为结束判断,如果参数s2所指的内存空间不够大,可能会造成缓冲溢出(buffer overflow)的错误情况,建议使用更加安全版本的strlcpy函数。
2、strncpy函数
函数原型:char *strncpy(char *s2, const char *s1, int n);
函数strncpy从s1指向的数组中最多复制n个字符(不复制空字符后面的字符)到s2指向的数组中。
缺陷:当n>strlen(s1)时,给s2不够数的空间里填充“\0”,会造成性能损失;
当n<=strlen(s1)时,s2是没有结束符“\0”的,那么用s2的时候没有结束位置,后续对于字符串的操作可能会造成内存的非法访问,因此为了避免发生这种错误,可以手动添加’\0’。
(s2指向的内存一定会被写n个字符)
3、memcpy函数
函数原型:void *memcpy(void *s1, const void *s2, size_t n);
由s2指向地址为起始地址的连续n个字节的数据复制到以s1指向地址为起始地址的空间内。函数返回一个指向s1的指针。
注意:1、s1和s2所指内存区域不能重叠。
2、与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。对于在数据中包含“\0”的数据只能用memcpy,如:"hell\0oworld"。
3、memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;
4、如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
5、s1和s2都不一定是数组,任意的可读写的空间均可。
4、strlcpy函数
函数原型:size_t strlcpy(char *dest, const char *src, size_t size);
(参数dest为目的字符串开始的指针,src为源字符串的开始地址,参数size代表dest字符串的大小)
在已知dest缓冲区大小并不会造成缓冲区溢出前提下,将src地址开始的字符串复制到以dest开始的地址空间,src字符串的大小。
优点:1、不需要手动添加’\0’,函数会复制n-1个字符,最后一个字符添加’\0’。
2、函数的返回值是strlen(src),可直接判断是否被截断。