关于scanf_s和strcpy_s

qq_38080117 2017-07-31 10:22:03
在VS2013里,如果用scanf和strcpy会提示出错,改成scanf_s和strcpy_s之后,如果是.cpp就没有错误,但是如果是.c就会提示strcpy_s缺少参数,这其中的原因是什么,大神解释一下,本人菜鸟。谢谢了!
...全文
255 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38080117 2017-08-09
  • 打赏
  • 举报
回复
引用 9 楼 ccssddnn218 的回复:
[quote=引用 8 楼 qq_38080117 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:]
#pragma warning(disable:4996)
...
问下这个东西是什么意思?用了它VS就不会报错了吗?[/quote] 出现这样的警告,是因为VC2005之后的版本中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。 对于这些问题,VC2005建议使用这些函数的更高级的安全版本,即在这些函数名后面加了一个_s的函数。这些安全版本函数使用起来更有效,也便于识别,如:strcpy_s,calloc_s等。 当然,如果执意使用老版本、非安全版本函数,可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。办法是在编译选项 C/C++ | Preprocessor | Preprocessor Definitions中,增加_CRT_SECURE_NO_DEPRECATE标记即可。 另外一种解决方法: #pragma warning(disable:4996) //全部关掉 选自:http://www.cnblogs.com/bpbp/archive/2011/07/12/2104775.html[/quote]谢谢大神指点!
Really_want 2017-08-04
  • 打赏
  • 举报
回复
引用 8 楼 qq_38080117 的回复:
[quote=引用 2 楼 zhao4zhong1 的回复:]
#pragma warning(disable:4996)
...
问下这个东西是什么意思?用了它VS就不会报错了吗?[/quote] 出现这样的警告,是因为VC2005之后的版本中认为CRT中的一组函数如果使用不当,可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如:strcpy、strcat等。 对于这些问题,VC2005建议使用这些函数的更高级的安全版本,即在这些函数名后面加了一个_s的函数。这些安全版本函数使用起来更有效,也便于识别,如:strcpy_s,calloc_s等。 当然,如果执意使用老版本、非安全版本函数,可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。办法是在编译选项 C/C++ | Preprocessor | Preprocessor Definitions中,增加_CRT_SECURE_NO_DEPRECATE标记即可。 另外一种解决方法: #pragma warning(disable:4996) //全部关掉 选自:http://www.cnblogs.com/bpbp/archive/2011/07/12/2104775.html
qq_38080117 2017-08-02
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#pragma warning(disable:4996)
...
问下这个东西是什么意思?用了它VS就不会报错了吗?
qq_38080117 2017-08-02
  • 打赏
  • 举报
回复
引用 5 楼 hou09tian 的回复:
这是strcpy()函数的格式

char *strcpy(  
   char *strDestination,  
   const char *strSource   
);  
这是strcpy_s()函数的格式

errno_t strcpy_s(  
   char *strDestination,  
   size_t numberOfElements,  
   const char *strSource   
);
 
可以看出strcpy()函数是两个参数,而strcpy_s()函数的参数是三个;所以直接把strcpy()改为strcpy_s()就会提示strcpy_s缺少参数。strcpy()函数的第一个参数表示目的字符串,第二个参数表示源字符串;strcpy_s()的第一个参数表示目的字符串;第二个参数表示目的字符串中元素的个数;第三个参数表示源字符串;如果把strcpy()改为strcpy_s(),只需要再为strcpy_s()添加一个参数,该参数添加到strcpy_s()函数的第二个参数位置上,为目的字符串中元素的个数,如

char dest[100] = {0};
strcpy(dest, "12345");
改为

char dest[100] = {0};
strcpy_s(dest,100, "12345");
明白了,万分感谢!
qq_38080117 2017-08-02
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
#pragma warning(disable:4996)
...
好的,谢谢
棉猴 2017-08-02
  • 打赏
  • 举报
回复
这是strcpy()函数的格式

char *strcpy(  
   char *strDestination,  
   const char *strSource   
);  
这是strcpy_s()函数的格式

errno_t strcpy_s(  
   char *strDestination,  
   size_t numberOfElements,  
   const char *strSource   
);
 
可以看出strcpy()函数是两个参数,而strcpy_s()函数的参数是三个;所以直接把strcpy()改为strcpy_s()就会提示strcpy_s缺少参数。strcpy()函数的第一个参数表示目的字符串,第二个参数表示源字符串;strcpy_s()的第一个参数表示目的字符串;第二个参数表示目的字符串中元素的个数;第三个参数表示源字符串;如果把strcpy()改为strcpy_s(),只需要再为strcpy_s()添加一个参数,该参数添加到strcpy_s()函数的第二个参数位置上,为目的字符串中元素的个数,如

char dest[100] = {0};
strcpy(dest, "12345");
改为

char dest[100] = {0};
strcpy_s(dest,100, "12345");
qq_38080117 2017-08-02
  • 打赏
  • 举报
回复
那就是说其他平台不能用了?
赵4老师 2017-07-31
  • 打赏
  • 举报
回复
#pragma warning(disable:4996)
...
kakabulusi 2017-07-31
  • 打赏
  • 举报
回复
缺少必要的头文件,你查一下这两个函数在哪个头文件里面,然后包含进去就行了
AlbertS 2017-07-31
  • 打赏
  • 举报
回复
scanf_s这两个函数只有微软的平台有,请谨慎使用

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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