关于 strcpy() 和 strcpy_s 的区别

JoshuaLui 2016-09-30 04:33:52


为啥 strcpy() 和 strcpy_s() 都编译出现错误?而MSDN文档中的例子就可以编译通过?求解!以下是MSDN文档中的例子。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

int main( void )
{
char string[80];
// using template versions of strcpy_s and strcat_s:
strcpy_s( string, "Hello world from " );
strcat_s( string, "strcpy_s " );
strcat_s( string, "and " );
// of course we can supply the size explicitly if we want to:
strcat_s( string, _countof(string), "strcat_s!" );

printf( "String = %s\n", string );
}
...全文
745 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-02
  • 打赏
  • 举报
回复
#pragma warning(disable:4996)
……
  • 打赏
  • 举报
回复

#define _CRT_SECURE_NO_WARNINGS
yunshouhu 2016-10-01
  • 打赏
  • 举报
回复
我都是在文件头部添加 #define _CRT_SECURE_NO_WARNINGS 1 即可关闭vs的警告。
赵4老师 2016-10-01
  • 打赏
  • 举报
回复
crt\src\下这两个函数的源代码都有。参考之。
paschen 版主 2016-09-30
  • 打赏
  • 举报
回复
strcpy_s会多一个参数,用于告诉缓冲区的大小,函数中会进行检查,如果溢出了则会抛出异常
paschen 版主 2016-09-30
  • 打赏
  • 举报
回复
因为这个函数是不安全,可能造成缓冲区溢出,所以现在建议用strcpy_s来代替 如果仍想用可以选择以下任何一种方法: 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS
JoshuaLui 2016-09-30
  • 打赏
  • 举报
回复
但是为啥那个MSDN文档中的例子就可以编译通过呢?参数的话是可以两个也可以三个。这个函数是在 cstring 和 string.h 中都有吧?
dustpg 2016-09-30
  • 打赏
  • 举报
回复
_s函数是微软自己加的, 不是标准库, 最直观的是C++下, 该函数不在std命名空间下. _s函数要求传递数组时(比如字符串)需要额外传递一个参数表示缓存长度以免出错. 反正我不用

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧