[C++]strcpy和strcpy_s安全性比较
输出窗口
这里有一个警告,虽然说警告没有什么问题,但是作为一个想要成为程序员的人,不能忽视警告,警告会不小心变成错误的,所以我查了查,知道了strcpy的安全性问题,strcpy没有保证目标字符串的大小肯定够源字符串大小,它只是假设目标字符串大小够大,为了解决这个安全性问题,微软加入了一个比strcpy安全性好的复制函数,多了一个参数,strcpy_s(char &strDestination,int size,char *strSource);多了一个size的参数,
这样子上面的程序改为
http://blog.youkuaiyun.com/qqyuanhao163/article/details/47113727
我在用vs2008编译以下程序时
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[5];
char b[4]="abc";
strcpy(a,b);
cout<<a<<endl;
int n;
cin>>n;
return 0;
}
输出窗口
复制代码
1>------ 已启动生成: 项目: Person, 配置: Debug Win32 ------
1>正在编译...
1>main.cpp
1>g:\学习\vs2008project\person\person\main.cpp(9) : 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.
1> c:\g460\microsoft studio 9.0\vc\include\string.h(74) : 参见“strcpy”的声明
1>正在链接...
1>正在嵌入清单...
1>生成日志保存在“file://g:\学习\VS2008Project\Person\Person\Debug\BuildLog.htm”
1>Person - 0 个错误,1 个警告
========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========
这里有一个警告,虽然说警告没有什么问题,但是作为一个想要成为程序员的人,不能忽视警告,警告会不小心变成错误的,所以我查了查,知道了strcpy的安全性问题,strcpy没有保证目标字符串的大小肯定够源字符串大小,它只是假设目标字符串大小够大,为了解决这个安全性问题,微软加入了一个比strcpy安全性好的复制函数,多了一个参数,strcpy_s(char &strDestination,int size,char *strSource);多了一个size的参数,
这样子上面的程序改为
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[2];
char b[4]="abc";
strcpy_s(a,4,b);//把b复制到a中,占4个位置,注意为a[2],用法:strcpy_s(destination, sizeof (destination) / sizeof (destination[0]), source);
cout<<a<<endl;
int n;
cin>>n;
return 0;
}
用strcpy_s就可以避免这些不可预料的行为。这个函数用两个参数、三个参数都可以,只要可以保证缓冲区大小.这样子这个字符复制函数就比strcpy安全些