QQ登录

只需一步,快速开始

strcpy与strcpy_s复制成功失败原因解析

[ 复制链接 ]
本人在使用VS2010时经常用到函数strcpy复制字符串操作。
正常strcpy就可以解决问题,但编译时会提示一连串建议替换文字。
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.
To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

警告仅仅是警告,不予理会就是。
提示文本意思是函数strcpy可能不安全,建议使用安全版本函数strcpy_s.
我有些强迫证,实在不想次次编译都看到一箩筐这样的提示。
解决方法有两个,
要么按提示的,使用预处理指令_CRT_SECURE_NO_WARNINGS,
要么就更换为安全函数。
第一种方法是在项目属性设置窗口,
在属性页面中找到“C/C++"——”预处理器“,添加上一行_CRT_SECURE_NO_WARNINGS就好,
具体操作过程网络图片演示有很多文章。

我直接使用更换函数方法。
具体函数strcpy_s的使用介绍也有很多好文章。
数组长度在两个参考上能够识别,就选择使用两个参数的版本,

  1. char cPW[0X10]={0X00};
  2.         strcpy(cPW,_T("gkbc8.com"));
复制代码
如果数组长度无法确定,那就使用三个参数版本的,函数参数2就是数组长;

  1. char* pDecryptBuf=new char[123];
  2.         strcpy_s(pDecryptBuf,123,pDecryptBuf);
复制代码


下面我使用strcpy_s就遇到问题啦,虽说复制成功了,但程序功能就达到,调试起来很棘手。
主要自己没去翻阅新版本的MSDN,手上6.0的又找不到此函数,网上看的文章写的也是马大哈。
我调试遇到的问题是strcpy_s函数会修改目标数组最后一字节内容。
本来数组初始化为0,且要复制的内容远小于数组长度,想不到复制后,数组未用到的字节都会被修改为0xfe,
反倒是strcpy不会,真瞎折腾。
这里记录一下这个注意事项,供大伙借鉴,勿入坑。
测试代码如下:
  1. char cPW[0X20]={0X00};//初始化后数组0x20空间全为0;
  2.         strcpy_s(cPW,_T("123456"));//复制后,数组内,内容123456以0结尾,其余全被搞成0xfe;
复制代码


回复

使用道具 举报

点击查看
快速回复 返回列表 客服中心 搜索