1、strcpy
原型声明:
char *strcpy(char* dest, const char *src);
功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括’\0’结束符,返回指向dest的指针。
不安全原因:依据源串的\0作为结束判断的,不会检查需要拷贝的缓冲区的大小,如果目标空间不够,就有溢出问题。
局限:只能将两个字符串进行完整的复制和赋值,不能实现仅复制某个字符串的前几个字符。
要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串。
头文件:c++: #include c:#include <string.h>
2、strcpy_s
strcpy_s和strcpy的主要区别:strcpy函数没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串。用strcpy_s就可以避免这些不可预料的行为。当存在缓存区溢出的问题时(即src的长度大于dst的长度),strcpy_s()会抛出异常;而strcpy()结果则未定,因为它错误地改变了程序中其他部分的内存的数据,可能不会抛出异常但导致程序数据错误,也可能由于非法内存访问抛出异常。
原型:
三个参数时:
strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
两个参数时:
strcpy_s( char (&strDestination)[size], const char *strSource ); // C++ only
风险:非C标准函数
2、strncpy
原型:
char *strncpy(char *dest, const char *src, size_t n)
功能:
从以src为首地址的字符串中至多复制n个字符到以dst为首地址的字符串,返回指向dest的指针。具体而言:如果在[0,n]之间没有’\0’结束符,则dst中没有结束符;如果遇到空字符(‘\0’),则把\0复制进去,空字符后面为原来的字符;如果src<n个字节,则以NULL填充dest直到复制完n个字节;如果src>n的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加’\0’(即结果dest不包括’\0’,需手动添加’\0’),dst输出时会出现乱码,直至碰到’\0’结束符为止。
要求:
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+‘\0’。
strncpy和strcpy的主要区别:strncpy多了一个参数n(第3个参数),可以指定要从src(源字符串)拷贝的字符个数。
风险:strncpy 不检查 dest 中是否有足够的空间,这将潜在导致缓冲区溢出。
头文件:来自C语言标准库,定义于 string.h
举例:
char s[20];
strcpy_s(s, sizeof(s), "AA BB CC"); // "AA BB CC"
strncpy(s, "tt", 2); // "tt BB CC"
strncpy(s, "rr", 3); // "rr"
4、strncpy_s
原型:
strncpy_s(char * str2, int size2, char * str1, int size1);
简而言之,如果你想寻求一种安全的字符串拷贝方法,可以:
//dst是字符数组char[]
std::string idString = "abc";
strncpy(dst, idString.c_str(), sizeof(dst) - 1);
dst[sizeof(dst) - 1] = 0;
参考:https://www.cnblogs.com/fortunely/p/14515340.html