C++中strcpy为什么 总是 “警告”

youxin2012 2012-11-13 07:17:37
问下我的 strcpy为什么 总是 “警告” warning C4996: 'strcpy' was declared deprecated 啊

代码如下,我用的 是VS2005
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
char arr1[]={"abcdefghi"};
char arr2[]={"ABCDEFG"};
//memset(arr1,0,5);
strcpy(arr1,arr2);

cout<<arr1;
cin.get();

return 0;
}
...全文
1919 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongwenjun 2012-11-13
  • 打赏
  • 举报
回复
GCC 就不警告. strcpy 效率高,要求调用者自己负责
hjrui09 2012-11-13
  • 打赏
  • 举报
回复
strcpy 本来就是不安全的函数! 因为使用者不能指明什么时候拷贝结束,只能编译器自动识别'\0'结束。 用得不好的时候会出错,所以才警告嘛。这个东西见仁见智,看使用者的水平
辰岡墨竹 2012-11-13
  • 打赏
  • 举报
回复
其实strncpy也是不安全的,如果缓冲区空间不够,它不会自动添加\0结束符。 而strncpy_s可以让用户选择截断方式。 所以微软才推出了_s系列函数,如果你不考虑移植到Linux下,尽量用这些安全函数。 #define _CRT_SECURE_NO_DEPRECATE 这个不要用。
qq120848369 2012-11-13
  • 打赏
  • 举报
回复
引用 4 楼 youxin2012 的回复:
谢谢你。 另外你的strncpy 是自己定义的吧。 我引用 cstring库中的 strncpy还是出现 警告啊 warning C4996: 'strncpy' was declared deprecated #include <iostream> #include <cstring> //#define _CRT_SECURE_NO_DEPRECATE……
NAME
       strcpy, strncpy - copy a string

SYNOPSIS
       #include <string.h>

       char *strcpy(char *dest, const char *src);

       char *strncpy(char *dest, const char *src, size_t n);

DESCRIPTION
       The  strcpy()  function copies the string pointed to by src, including the terminating null byte ('\0'), to the buffer pointed to by dest.  The
       strings may not overlap, and the destination string dest must be large enough to receive the copy.  Beware of buffer overruns!  (See BUGS.)

       The strncpy() function is similar, except that at most n bytes of src are copied.  Warning: If there is no null byte among the first n bytes of
       src, the string placed in dest will not be null-terminated.

       If the length of src is less than n, strncpy() writes additional null bytes to dest to ensure that a total of n bytes are written.

       A simple implementation of strncpy() might be:

           char *
           strncpy(char *dest, const char *src, size_t n)
           {
               size_t i;

               for (i = 0; i < n && src[i] != '\0'; i++)
                   dest[i] = src[i];
               for ( ; i < n; i++)
                   dest[i] = '\0';

               return dest;
           }

RETURN VALUE
       The strcpy() and strncpy() functions return a pointer to the destination string dest.
sumos 2012-11-13
  • 打赏
  • 举报
回复 1
deprecated 表示 不建议使用。 现在一般改为strcpy_s安全性较高的函数了。
FrankHB1989 2012-11-13
  • 打赏
  • 举报
回复
引用 4 楼 youxin2012 的回复:
谢谢你。 另外你的strncpy 是自己定义的吧。 我引用 cstring库中的 strncpy还是出现 警告啊 warning C4996: 'strncpy' was declared deprecated #include <iostream> #include <cstring> //#define _CRT_SECURE_NO_DEPRECATE……
_s是M$提交标准化的扩展,正式定义在ISO/IEC TR 24731-1。 strncpy是C99和C++98起的库函数,所谓deprecated是M$自己扯的。 #define _CRT_SECURE_NO_DEPRECATE放最前面。
youxin2012 2012-11-13
  • 打赏
  • 举报
回复
谢谢你。 另外你的strncpy 是自己定义的吧。 我引用 cstring库中的 strncpy还是出现 警告啊 warning C4996: 'strncpy' was declared deprecated #include <iostream> #include <cstring> //#define _CRT_SECURE_NO_DEPRECATE using namespace std; int main() { char arr1[]={"abcdefghi"}; char arr2[]={"ABCDEFG"}; //memset(arr1,0,5); strncpy(arr1,arr2,4); //cout<<arr1; cin.get(); return 0; }
qq120848369 2012-11-13
  • 打赏
  • 举报
回复
因为strcpy不判断dest的buffer长度,可能因为src长于dest而造成dest写溢出。 用strncpy是永远的选择,strcpy已经很久没有出现在我的代码里了。 看一下它的实现吧:
       A simple implementation of strncpy() might be:

           char *
           strncpy(char *dest, const char *src, size_t n)
           {
               size_t i;

               for (i = 0; i < n && src[i] != '\0'; i++)
                   dest[i] = src[i];
               for ( ; i < n; i++)
                   dest[i] = '\0';

               return dest;
           }
注意永远给buffer - 1的位置封0, 无论snprintf返回几。
转角天边 2012-11-13
  • 打赏
  • 举报
回复
引用 1 楼 zhuankeshumo 的回复:
http://bbs.csdn.net/topics/390279925看一下 一样的
newtee 2012-11-13
  • 打赏
  • 举报
回复
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。
内容概要:本文研究了基于QLearning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制的应用,通过Matlab代码实现了控制算法的仿真验证。该方法融合强化学习的在线自适应能力与传统PID控制的稳定性优势,利用QLearning算法动态优化PID控制器的比例、积分、微分参数,以应对水下复杂流体环境、模型不确定性及外部干扰等挑战,从而提升AUV轨迹跟踪的精度、鲁棒性与动态响应性能。文系统阐述了AUV的六自由度非线性动力学建模过程、QLearning算法的状态空间与动作空间设计、奖励函数构造及训练机制,并详细说明了PID参数自整定的闭环控制架构。仿真结果表明,相较于传统固定参数PID控制器,该智能控制策略在多种工况下均展现出更优的控制效果,有效抑制了超调,加快了响应速度,并增强了抗干扰能力。; 适合人群:具备自动控制理论、强化学习基础及Matlab/Simulink仿真能力,从事水下机器人、智能控制、海洋工程、自动化等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于AUV、UUV等无人水下平台的高精度自主导航与运动控制;②为解决非线性、强耦合、时变系统的控制器参数自适应整定问题提供智能化解决方案;③作为强化学习与经典控制理论深度融合的技术范例,推动智能控制算法在海洋装备的工程化应用。; 阅读建议:建议读者结合提供的Matlab代码深入理解算法实现细节,重点剖析QLearning的状态-动作-奖励机制设计、PID参数更新逻辑及仿真对比实验结果,有条件者可在更复杂的动力学模型或实际硬件平台上进一步验证与优化算法性能。

65,211

社区成员

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

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