c++ strcpy-s和strcat-s
c++ strcpy_s和strcat_schar csName[20];strcpy_s(csName,20,_T("123"));//这句应该是没问题的.strcat_s(csName,20,_T("456"));//这里应该会出问题吧我理解的strcat_s第二个参数应该是csName可以容纳的长度,如果_T("456")改成一个长度大于17的值,那么上面这句话不就溢出了么?strcat_s(csName,20-3,_T("456"));//如果这样写的话,那么也就是说每次都要去计算csName可容纳的长度(很多strcat的情况不是会很复杂么)?
最佳回答
strcat_s和strcpy_s的第二个参数都是说明第一个字符串所容纳的字符个数,所以我理解的strcat_s第二个参数应该是csName可以容纳的长度,如果_T("456")改成一个长度大于17的值,那么上面这句话不就溢出了么?是大于等于17都会溢出(^_^还有个字符串结尾标志也算一个字符!)strcat_s之类的函数的目的就是消除长久以来的字符串溢出的问题,所以设置第二个参数只是告诉操作的的时候需要处理的字符个数,并不会检查目标串可容纳的字符长度。(因为并不一定可以得知目标串的长度,比如你用malloc分配了一块内存,然后用一个字符串指针指向该内存,但是你不能知道这块内存有多大。)eg:#define N 20。。。char szName[N];//语句1strcpy_s(szName,n1,_T("123"));//语句2strcat_s(szName,n2,_T("add"));//语句3N=20,n1=20时若n2n2>7,而源字符串的长度合适,若n>20,读取内存错误,溢出错误N=10时若n110,不管字源符串长度是多长,都会出错,但是这是属于读取内存出错,属于溢出类型的出错。总结一下:xxxxxx_s这样的函数的第二个参数的意义是告诉操作系统目标串可以容纳多少个字符,但是并不会真正检查目标串可以容纳多少个字符,设置这样的目的是因为程序员一般知道是多少个,或者使用sizeof来获取字符串的大小即可。
最新回答共有2条回答
-
2026-03-30 17:18:14稳重的帆布鞋
回复strcat_s和strcpy_s的第二个参数都是说明第一个字符串所容纳的字符个数,所以我理解的strcat_s第二个参数应该是csName可以容纳的长度,如果_T("456")改成一个长度大于17的值,那么上面这句话不就溢出了么?是大于等于17都会溢出(^_^还有个字符串结尾标志也算一个字符!)strcat_s之类的函数的目的就是消除长久以来的字符串溢出的问题,所以设置第二个参数只是告诉操作的的时候需要处理的字符个数,并不会检查目标串可容纳的字符长度。(因为并不一定可以得知目标串的长度,比如你用malloc分配了一块内存,然后用一个字符串指针指向该内存,但是你不能知道这块内存有多大。)eg:#define N 20。。。char szName[N];//语句1strcpy_s(szName,n1,_T("123"));//语句2strcat_s(szName,n2,_T("add"));//语句3N=20,n1=20时若n2n2>7,而源字符串的长度合适,若n>20,读取内存错误,溢出错误N=10时若n110,不管字源符串长度是多长,都会出错,但是这是属于读取内存出错,属于溢出类型的出错。总结一下:xxxxxx_s这样的函数的第二个参数的意义是告诉操作系统目标串可以容纳多少个字符,但是并不会真正检查目标串可以容纳多少个字符,设置这样的目的是因为程序员一般知道是多少个,或者使用sizeof来获取字符串的大小即可。
热门文章
- 康达学院专转本五年制
- 高考一个考场分ab卷吗
- not only but also用法
- 某物体做自由落体运动,从释放开始计时,则物体在前2s内的平均速度为______m/s,物体下落2m时的速度大小为______m/s.
- 三角函数公式大全表格
- 地理中考必背知识点2022
- 2013-2014学年小学六年级科学上学期期末考试试卷及答案
- 人教版2014-2015学年小学五年级英语第二学期期中教学质量检测试卷及答案
- 【Linux驱动开发】设备树详解(二)设备树语法详解
- 别跟客户扯细节
- 在别的城市买房子能落户吗
- 卖房前要把装修贷还完吗
- 高中政治教学提高教学效果的方法探究
- “互联网+”背景下的初中英语课堂教学改革与创新策略研究
- 2022年终止合同范本
- 租房合同范本范文
- 如何挑选土豆
- 如何挑选土鸡
