关于strcpy的安全函数的选择
1)如果整个程序,在进行字符拷贝时,这个拷贝字符串的完整性,不影响整个程 序的运行,可以让其截取一部分字符串,程序继续执行。那么我们就可以选择安全 函数:strncpy_s
2)如果在进行字符串拷贝时,源字符串不能完整拷贝到目的字符串,会影响整个 程序的运行,那我们就需要终了程序。这样的话,我们就选择安全函数:strcpy_s
所以在选择这两个安全函数时,就要根据需求来进行
以下是自己查资料和写程序验证的一点小总结,共享如下。如果有什么不同见解, 请指出!!
1.strcpy 有bufferOverFlow风险,会破坏内存。
声明:char *strcpy(char* dest, const char *src);
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
注:dest的空间必须要能够存储src的长度加上NULL字符
2.关于strcpy_s 不会有bufferOverFlow,但是当源串的长度大于目标缓冲区大小 时,会有提示性错误
声明:strcpy_s(char* dest, size_t numElems, const char* src)
功能:
注:第二个参数表示目标缓冲区大小,大于或等于源串的长度+1(存放结束符 /0),strcpy_s必须完全拷贝源串,若只想拷贝一部分源串则应该用strncpy_s函数。
当源串的长度大于目标缓冲区大小(也就是第二个指定的参数的值),不会发 生overflow,但是会有以下的提示错误:(Release和debug都会提示,只是debug 的提示会更加详细。下面是release的提示)
問題が発生したため、exeを終了します。ご不便をおかけして申し訳ありません
3.strncpy 有bufferOverFlow风险,会破坏内存
声明:char *strncpy(char *strDest,const char *strSource,size_t count);
功能:将strSource的count个字符复制到strDest中,如果count小于或者等于 strSource的长度,
NULL字符就不会自动的加到已经复制的字符串后面;如果count大于strSource的长 度,会用NULL字符来填充到复制的字符串后面使其长度达到count
可以参考msdn以下地址,里面有例子,自己可以参考运行。
http://msdn.microsoft.com/zh-cn/library/xdsywd25(v=vs.90).aspx
4.strncpy_s 能截取一部分字符串,让程序继续运行
声明:errno_t strncpy_s(char *strDest,size_t numberOfElements,const char *strSource,size_t count);
功能:请参考:http://msdn.microsoft.com/zh-cn/library /5dae5d43(v=vs.90).aspx
posted on 2013-12-28 13:39 honglihua 阅读(1916) 评论(0) 编辑 收藏 举报