strcat和strcpy的区别?strcpy函数会覆盖原来的吗
很多朋友对于strcat和strcpy的区别和strcpy函数会覆盖原来的吗不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
C语言中strcat和strcpy的区别
一、功能不同
1、strcat:字符串复制。把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间。
2、strcpy:把两个字符串连接起来,把src所指字符串添加到dest结尾处。
二、用法不同
1、strcat:char*strcpy(char* dest, const char*src)。
2、strcpy:extern char*strcat(char*dest,char*src)。
三、规定不同
1、strcat:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。
2、strcpy:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
参考资料来源:百度百科-strcpy
参考资料来源:百度百科-strcat
c++ strcpy_s和strcat_s
strcat_s和strcpy_s的第二个参数都是说明第一个字符串所容纳的字符个数,所以
我理解的strcat_s第二个参数应该是csName可以容纳的长度,如果_T("456")改成一个长度大于17的值,那么上面这句话不就溢出了么?
是大于等于17都会溢出(^_^还有个字符串结尾标志也算一个字符!)
strcat_s之类的函数的目的就是消除长久以来的字符串溢出的问题,所以设置第二个参数只是告诉操作的的时候需要处理的字符个数,并不会检查目标串可容纳的字符长度。(因为并不一定可以得知目标串的长度,比如你用malloc分配了一块内存,然后用一个字符串指针指向该内存,但是你不能知道这块内存有多大。)
eg:
#define N 20
...
char szName[N];//语句1
strcpy_s(szName,n1,_T("123"));//语句2
strcat_s(szName,n2,_T("add"));//语句3
N=20,n1=20时
若n2<7,调试出错,但这不是溢出出错,而是因为调用strcat_s时操作的字符数(7)大于n1所以出错,相当于strcat_s抛出溢出或者说strcat_s的断言(ASSERT)为假。
若20>n2>7,而源字符串的长度合适,就不会出错
若n>20,读取内存错误,溢出错误
N=10时
若n1<10,源字符串长度合适,不会出错。
二n1>10,不管字源符串长度是多长,都会出错,但是这是属于读取内存出错,属于溢出类型的出错。
总结一下:
xxxxxx_s这样的函数的第二个参数的意义是告诉操作系统目标串可以容纳多少个字符,但是并不会真正检查目标串可以容纳多少个字符,设置这样的目的是因为程序员一般知道是多少个,或者使用sizeof来获取字符串的大小即可。
关于strcpy、strcat的用法
strcpy()是字符串复制函数。连字符串的结束标志‘\0’一同复制。
对于strcpy(a+1,b+2);中的b+2则是数组里的“h\0”的首地址。
a+1则是数组里的“bcde”的首地址。
即此函数的意义是:把“h\0”复制到“bcde”的位置。字符串遇到‘\0’结束
即结果是:ah。
对于strcat(s[0],s[1]);中的二为数组可以看成是多个一维数组组成的。所以s[0]代表的是“a”的首地址,s[1]代表的是“good”的首地址。这是字符串连接函数。即把good放到了a的后面。
结果是:agood。
关于strcat和strcpy的区别和strcpy函数会覆盖原来的吗的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。