Visual Studio错误:strcpy出现C4996错误的解决
问题描述及原因
在学习字符串处理函数strcpy以及数组这一节的时候,使用和老师一样的代码(编译器不同),编译器却出现如下报错:
错误 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.
在网上一番查找,初步了解了报错的原因在于:由于微软在VS中不建议再使用C的传统库函数scanf,strcpy,sprintf等,原因在于他们都检查不出边界,没法保证有效缓冲尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串,极易造成栈溢,导致不可预料的行为。
因而,VS建议采用带_s的函数,如scanf_s、strcpy_s,但这些并不是标准C函数。
很多时候,出现unsafe警告只需要将你的不安全函数替换为上面那段英语中让你替换的strcpy_s函数即可。
但是,对于strcpy_s函数,并不是简单将strcpy改为strcpy_s就可行了,它还会报出如下错误,例如
错误 Run-Time Check Failure #2 - Stack around the variable 'str3' was corrupted.意思是strcpy_s参数太少,它需要三个参数。
问题的解决
在经过一番探究实验后,strcpy_s的三个参数的意义以及解决方式总结如下:
例如 strcpy_s(str1,中间参数,str2);
中间参数的意义可以理解为:str2预计需要向str1占用多少空间
所以很显然中间参数的值的大小,必须大于等于str2的空间,但是小于等于str1空间(前提:str1>=str2)
通常情况下可以写为:
strcpy_s(str1,sizeof(str2),str2);
或者strcpy_s(str1,strlen(str2)+1,str2);
//strlen()+1的理由,sizeof函数是包含\0,而strlen函数不包含\0。而\0是终止符,必须带上,所以也要给它留有空间。
对于str2是没有声明数组,如 : str1[100]
strcpy_s(str1,20,“i love u”);
则中间参数(20)直接取值满足大于等于str2的空间,但是小于等于str1[100]空间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)