1.字符与字符串类型的区别:
![](https://i-blog.csdnimg.cn/blog_migrate/fac2537603c4f5667c767400f92c843a.png)
2.字符串的存储:
第一组:
![](https://i-blog.csdnimg.cn/blog_migrate/6958d1fa351e05a0df1a20f693b20699.png)
![](https://i-blog.csdnimg.cn/blog_migrate/313491d23a6225d7f20ab935f7e32973.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cce6a71d167b990b862c72235a4a43fe.png)
第二组:
![](https://i-blog.csdnimg.cn/blog_migrate/af2c6b319fd4ef31bb5f1bcc075ccac1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/52a63822102f3b3a8dc2b5ac066a427f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ab2db286e05f50237177903d10b743b9.png)
3.求字符串长度--strlen(string lenth):
![](https://i-blog.csdnimg.cn/blog_migrate/9244983c276f50242035b75d9ee33848.png)
①字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )
![](https://i-blog.csdnimg.cn/blog_migrate/438b39feadbc0ab6cb926e7d6b7b0367.png)
②参数指向的字符串必须要以 '\0' 结束
例一:
![](https://i-blog.csdnimg.cn/blog_migrate/e37cbba8fc61b3bcdc634619bce9aa41.png)
例二:
![](https://i-blog.csdnimg.cn/blog_migrate/e436f4977ff95de3cdb2dee6d4c6d91f.png)
例三:
![](https://i-blog.csdnimg.cn/blog_migrate/fa83d4660a88f559c934f74b1781689e.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/ccc31e56b1edc2e32eff9a1833a7f650.png)
③#include<string.h>是strlen函数的库函数:
![](https://i-blog.csdnimg.cn/blog_migrate/b4b41c5e1b7fd63208ecb3de300877ec.png)
无库函数:
![](https://i-blog.csdnimg.cn/blog_migrate/ad1708fc6a07eb2ad17da7fddfc71c7c.png)
有库函数:
![](https://i-blog.csdnimg.cn/blog_migrate/40e9606454bd19b266bbef88ba2e12b5.png)
④注意函数的返回值为size_t,是无符号的( 易错 )整型
![](https://i-blog.csdnimg.cn/blog_migrate/bf279803c33f07081ad58f6d01386c73.png)
为什么会是这么个与预期相反的输出结果?
因为(无符号)3 - (无符号)6的输出结果是个非常大的整型数
修改一:强制类型转换
![](https://i-blog.csdnimg.cn/blog_migrate/a452753295f1fdad40c5df9e35139d96.png)
修改二:比大小
![](https://i-blog.csdnimg.cn/blog_migrate/4496f4f44600e1ba62ed8243c9558783.png)
4.模拟实现strlen:
方法一:用计数器方法进行模拟:
![](https://i-blog.csdnimg.cn/blog_migrate/c5a01a850bcbf4d4b5b914c7c2ec34dc.png)
方法二:使用函数递归不创建临时变量进行实现:
![](https://i-blog.csdnimg.cn/blog_migrate/1c490929bdb43d1321260801b64ec982.png)
方法三:利用指针-指针得到的是中间元素个数来实现:
![](https://i-blog.csdnimg.cn/blog_migrate/3517553aad8e52873af9e679b6d3b28f.png)
注:这种方法的思想就是找到'\0'的地址减去首元素的地址就是中间元素的个数即为字符串长度.
5.长度不受限制的字符串函数--strcpy
![](https://i-blog.csdnimg.cn/blog_migrate/993a899d0032cbdf4f9e029ab5cf26f4.png)
①将source的字符复制给destination
![](https://i-blog.csdnimg.cn/blog_migrate/78e0c8eedd8a45989a5e155350e2b1e1.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/0a4f1f0800c9f8fc04165c8d91d91295.png)
②源字符串必须以 '\0' 结束
![](https://i-blog.csdnimg.cn/blog_migrate/265efeec36c0d28e14931ae85f3379e3.png)
输出结果:程序崩溃
![](https://i-blog.csdnimg.cn/blog_migrate/2931f81427f335fcb07d811b938fd9d7.png)
修改一:
![](https://i-blog.csdnimg.cn/blog_migrate/589326d0a08a263414b3807bf3bf1baa.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/aab2d714669016faf74469a07d3ab656.png)
修改二:
![](https://i-blog.csdnimg.cn/blog_migrate/e67fc0c6df39b8ac7ab4af8a200fb6bb.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/0d824ead744c241cfedce48cc24e264b.png)
③会将源字符串中的'\0'拷贝到目标空间
![](https://i-blog.csdnimg.cn/blog_migrate/94d489586f58c2536dc0676b3201f1c7.png)
展示:
![](https://i-blog.csdnimg.cn/blog_migrate/8f24f75299109152ba77544f24660d5d.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/ef689013a621ff487ea72dad86cafb8e.png)
缺点:printf遇到'\0'就停止输出
④目标空间必须足够大,以确保能存放源字符串
![](https://i-blog.csdnimg.cn/blog_migrate/8c451a9e9f5d9e0fa9eb811ca5ba0ee4.png)
输出结果:警告栈破坏(撑破),点击中止后输出正确的结果(表明strcpy确实将源字符串复制了过去,真是个愣头青)
![](https://i-blog.csdnimg.cn/blog_migrate/14939dfd5e220dbd9f40ec65a6168f97.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ca4ee4f0bb9af165896ebf2c2fd0c885.png)
注:这就是字符串长度不受限制
⑤目标空间必须可变
![](https://i-blog.csdnimg.cn/blog_migrate/702ff2d16cabc50fa0d97f12c885d096.png)
输出结果:程序崩溃
![](https://i-blog.csdnimg.cn/blog_migrate/061509a42f8a746902547fe12c5a1f9f.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/2530c52f124c826e4d93a8e3fe4b97a1.png)
⑥模拟实现strcpy:
![](https://i-blog.csdnimg.cn/blog_migrate/7b0ec97c5d799557ac4141f13722d314.png)
解释:
①
![](https://i-blog.csdnimg.cn/blog_migrate/466d588174d993a983bd4b7fa4c817af.png)
②
![](https://i-blog.csdnimg.cn/blog_migrate/454b7428e08bcdd5db315d28e1bdd000.png)
③
![](https://i-blog.csdnimg.cn/blog_migrate/5d4ac38e007a0c818c1df02a7ba74879.png)
④
![](https://i-blog.csdnimg.cn/blog_migrate/ff18536cb3e55e85d3b6a2a9332e6a30.png)
⑤
![](https://i-blog.csdnimg.cn/blog_migrate/dadc5e3382648c9560e943ffe537c50d.png)
精简版:
![](https://i-blog.csdnimg.cn/blog_migrate/1d6f4ab6ddf34968524021ad2a7db288.png)
6.长度不受限制的字符串函数--strcat
![](https://i-blog.csdnimg.cn/blog_migrate/6117d516c7c5eec1232999d43901ed87.png)
①将源字符串追加给目标空间,
![](https://i-blog.csdnimg.cn/blog_migrate/9d081493daf6211a71ccd9df24a7a2cb.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/2c0e987c26da1f5394dd99b583a99aa5.png)
②追加时从目标空间'\0'处开始覆盖,直到把源字符串的'\0'复制过去为止
![](https://i-blog.csdnimg.cn/blog_migrate/7c5b86eaa5324af362c98a7c8686fb49.png)
覆盖前:
![](https://i-blog.csdnimg.cn/blog_migrate/8a24cb161e49fffac184e70c87bf6086.png)
覆盖后:
![](https://i-blog.csdnimg.cn/blog_migrate/92ecd278e79f7cd3458f295fa0f52a4c.png)
③源字符串必须以 '\0' 结束
![](https://i-blog.csdnimg.cn/blog_migrate/dfdbc8a3bb5766f33bcf64701ba1482f.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/93cce0f856aee41443774486b82d49fe.png)
④目标字符串必须以'\0'结束:
![](https://i-blog.csdnimg.cn/blog_migrate/60da98c9f4102b0a47e86ccd45f1f0d2.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/5f963977976830763261d2d0552e91ff.png)
⑤目标空间必须有足够的大,能容纳下源字符串的内容
⑥目标空间必须可修改
⑦模拟实现strcat:
![](https://i-blog.csdnimg.cn/blog_migrate/dd8a2ee884ad17b12ae4c17ed8b7927c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bd3c62e2eb489bbfaf10ec18b2839e3e.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/fb5237d01c55cf37b33994fbc3cd68e3.png)
⑧字符串自己给自己追加,如何?
![](https://i-blog.csdnimg.cn/blog_migrate/852c5ea94cea578c0c6c9bd2d7e0e692.png)
输出结果:程序崩溃
![](https://i-blog.csdnimg.cn/blog_migrate/aa66ec37b0e828bbb072f15725a4137d.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/6d88e6dfbb5b0895a47df6c527d8fa80.png)
注:把字符串的\0覆盖后就停不下来了,即进入死循环了
7.长度不受限制的字符串函数--strcmp:
![](https://i-blog.csdnimg.cn/blog_migrate/9fe76b18b913378b97a7715265e66247.png)
①此函数不是比较字符串的长度,而是比较字符串中对应位置上的字符大小(ASCLL码值),如果相等就比较下一组,直到不同或者都遇到\0
②.
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
注:VS中分别返回的是 1、0 、-1
![](https://i-blog.csdnimg.cn/blog_migrate/1d175fb09e55a67296071577f32b5961.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/e883d0c579be7951a63a14c019d703fc.png)
③模拟实现strcmp:
![](https://i-blog.csdnimg.cn/blog_migrate/452e161f25d22dedb77914319a05fc1b.png)
8.长度受限制的字符串函数--strncpy
![](https://i-blog.csdnimg.cn/blog_migrate/df9347be5cf7abda64e31c8b129405dc.png)
①拷贝num个字符从源字符串到目标空间
![](https://i-blog.csdnimg.cn/blog_migrate/138a7e5f23109393797003ea7cdf84c0.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/ef25d1c5cd52257f61a505316843e256.png)
②如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
![](https://i-blog.csdnimg.cn/blog_migrate/5bdf030dccae94db1ee72333cac08441.png)
覆盖前:
![](https://i-blog.csdnimg.cn/blog_migrate/38dfc1760db06224d8106416e526744a.png)
覆盖后:
![](https://i-blog.csdnimg.cn/blog_migrate/ac8746b0666efe33393d5468d465e77c.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/36f32b8e860705b848f993185914c48b.png)
9.长度受限制的字符串函数--strncat
![](https://i-blog.csdnimg.cn/blog_migrate/dfe2275acd53e20a3a24e78960e79035.png)
![](https://i-blog.csdnimg.cn/blog_migrate/68fa47ba3858b1ebec870629e0a31a49.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/0742582273684dd07f3f890aa114ce66.png)
①复制时源字符串的\0会被复制过去,同时目标空间复制的起点是\0
![](https://i-blog.csdnimg.cn/blog_migrate/dacc5858284f897d8b46ca2cf192543f.png)
覆盖前:
![](https://i-blog.csdnimg.cn/blog_migrate/9a4abaffb6f25d02b0dc7c17f94ba76c.png)
覆盖后:
![](https://i-blog.csdnimg.cn/blog_migrate/3a07da34c26a344bd220600068d7861b.png)
10.长度受限制的字符串函数--strncmp
![](https://i-blog.csdnimg.cn/blog_migrate/f154f5e31b2d11a3c157ecba0cc0ac08.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f6773aa0c0e9df1a14696d135d17b862.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/7e645d28eea71dec64be6e51ecc7e454.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/7f0f5ac4386e8610f87f40f9c52cf8c1.png)
11.提一下容易与strcmp搞错的知识
①数组一 < 、> 、= 数组二 :比较两数组的地址
![](https://i-blog.csdnimg.cn/blog_migrate/bbb0ab05a914ce808d1ee9df7231ff34.png)
②"字符串1" >、<、= "字符串2" :比较两字符串首字母的地址
![](https://i-blog.csdnimg.cn/blog_migrate/2ae374d97114c91344d2f0570383ad0e.png)
12.字符串查找--strstr
![](https://i-blog.csdnimg.cn/blog_migrate/7de23bb330cbbef1656a941eb8c66379.png)
①返回一个在str1中指向与str2相同字符串的首元素地址,如果没有则返回NULL
![](https://i-blog.csdnimg.cn/blog_migrate/342b9f00bd2ce179f2aa2992b3103736.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/94c0844d7911a0f017ee9e2fdc44a515.png)
②模拟实现strstr:
![](https://i-blog.csdnimg.cn/blog_migrate/4f68844c5f644f3ac21ecf89afdf3fdd.png)
解释:
①
part 1:
![](https://i-blog.csdnimg.cn/blog_migrate/a04a04158d298893f181b3b4a576b069.png)
part 2:
![](https://i-blog.csdnimg.cn/blog_migrate/807d65739ea4188408877d24a5170a58.png)
完整版:
![](https://i-blog.csdnimg.cn/blog_migrate/dd571c7e117ca0bb45ed372194b202ba.png)
②
part 1:
![](https://i-blog.csdnimg.cn/blog_migrate/a1206d53c6096d752d9bd8adb6b009fb.png)
part 2:
![](https://i-blog.csdnimg.cn/blog_migrate/739576a7d90c120eb0646ab63ef4c7c2.png)
part 3:
![](https://i-blog.csdnimg.cn/blog_migrate/b55bcde2195cb8ee88d3fe8031b242f0.png)
完整版:
![](https://i-blog.csdnimg.cn/blog_migrate/781637049b78d800ad58e5746f07ff1b.png)
13.字符串查找--strtok
![](https://i-blog.csdnimg.cn/blog_migrate/1bc1348bf2f7554242ca74d95ea70a85.png)
①sep参数是个字符串,定义了用作分隔符的字符集合
![](https://i-blog.csdnimg.cn/blog_migrate/6e4659a677f4a187847768a00ec37c02.png)
②第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
③strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
![](https://i-blog.csdnimg.cn/blog_migrate/e26cfdb673e1a1d88d57a0e57c7ae86f.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/3531ebce93713f98e2b30bb7e32fe4ff.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/eb36a91992e1c74abc97adb0476910f7.png)
④(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
字符串被改变举例演示:
![](https://i-blog.csdnimg.cn/blog_migrate/66287b087354c774847897f8598303c0.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/533e8537197f5574b7233e44c80b27e0.png)
临时拷贝举例演示:
![](https://i-blog.csdnimg.cn/blog_migrate/0d4bd1836e364c3c83debccdb64938a5.png)
⑤strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
⑥strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
![](https://i-blog.csdnimg.cn/blog_migrate/65564dfc236d635725d7eae22678118f.png)
⑦如果字符串中不存在更多的标记,则返回 NULL 指针
![](https://i-blog.csdnimg.cn/blog_migrate/d0d668066a88af4b3c0601e60a5ae30e.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/0a1a93a332db8491ea09317c05195965.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/63b38e3f89fad40849200f9d97cc95ce.png)
对上面案例(\0充当结尾分隔符,以及返回NULL指针)再举一例说明:
![](https://i-blog.csdnimg.cn/blog_migrate/1a04740a8cd4a6162d13a1c94ac4eada.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b543a2157d06ba3eeb084f3ca6d4f351.png)
原理:
![](https://i-blog.csdnimg.cn/blog_migrate/8e04607361aa4b488e5749ab7cc85677.png)
⑧标准写法:
![](https://i-blog.csdnimg.cn/blog_migrate/50eb96f0de9ee9d07f73c9b1bb1a2a10.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/9da17f1bba53a67a2c7cdb865877179b.png)
14.错误信息报告--strerror
![](https://i-blog.csdnimg.cn/blog_migrate/33e7b41dfdff328ec9e8c0729b9a6f07.png)
errno:错误码,属于全局变量
注:我们打开网页时遇到404,网页打开失败。404就是一个错误码。
strerror函数的功能:返回错误码所对应的错误信息的起始位置
![](https://i-blog.csdnimg.cn/blog_migrate/34a74e3e9eb5fac2bad38be5f476a0e7.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/1374fa8c7521175015562043222f7586.png)
案例:
![](https://i-blog.csdnimg.cn/blog_migrate/587d7d0c4eb154f4b2905cf79ee96148.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/15c45f9605c4e8c00b6a15bee5644deb.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/185d7c1d5942191085a8eab18dd1f23d.png)
15.perror:
![](https://i-blog.csdnimg.cn/blog_migrate/38cb2bc621e224ecdc6e1722d8bfb167.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cc7a2fbe63440deace27974bc98bb4d5.png)
功能:
①把错误码转化为错误信息
②打印错误信息(包含了自定义的信息)
![](https://i-blog.csdnimg.cn/blog_migrate/5f21e679cb3d9f7e480e4d2b49e71af0.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/82e4200ee179c87874b8f234191e15b2.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/05a25debbe98ef7e46ca4ece104c902c.png)
举例说明:
![](https://i-blog.csdnimg.cn/blog_migrate/6d57c8df179abbc901ea151c5439a831.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/b7596789267571af038eb980002453fd.png)
16.字符分类函数
![](https://i-blog.csdnimg.cn/blog_migrate/abc60030986693cc86bc26de16937608.png)
注:
①字符分类函数包含于头文件ctype.h中
②字符分类函数内的内容为真时返回一个非0的随机整型数,为假时返回0
举isdigit为真例:
![](https://i-blog.csdnimg.cn/blog_migrate/5d9531c9f75640f7c6535d5a706da1aa.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/116213215dc34b4e1652f744c8fda472.png)
举isdigit为假例:
![](https://i-blog.csdnimg.cn/blog_migrate/407a4f2871a1d621be3471398b1d87e3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4754180df4b4599a875ee6e90dc50a3a.png)
举islower为真例
![](https://i-blog.csdnimg.cn/blog_migrate/e2cb6229a043f43242a3e6d418f38707.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/f3f5b98cfb949d2322c04f66a100b33b.png)
17.字符转换函数:
![](https://i-blog.csdnimg.cn/blog_migrate/e79e9f45ac61235723830da65cd364fb.png)
举例:
![](https://i-blog.csdnimg.cn/blog_migrate/a404a5b091ada6dbcbc7391312004143.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/b4e30ff8c70a97d6f9e4c91fe68b9e74.png)
18.内存操作函数--memcpy
![](https://i-blog.csdnimg.cn/blog_migrate/815f3722b1e1818a7fe269f304b8b79e.png)
①函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
②这个函数在遇到 '\0' 的时候并不会停下来
③如果source和destination有任何的重叠,复制的结果都是未定义的
举例:
![](https://i-blog.csdnimg.cn/blog_migrate/e5d4c9986c740740edc7a04d8c63483d.png)
覆盖前:
![](https://i-blog.csdnimg.cn/blog_migrate/ec2d67b7472b709346523a5a386b81d5.png)
覆盖后:
![](https://i-blog.csdnimg.cn/blog_migrate/631197b83a5098f0bfff9d9348082b57.png)
解释:
![](https://i-blog.csdnimg.cn/blog_migrate/8aa80c1982158bb09c27677251c36522.png)
19.模拟实现memcpy:
![](https://i-blog.csdnimg.cn/blog_migrate/ec402adc716e87eec5ea1832f7d099d7.png)
原理:
![](https://i-blog.csdnimg.cn/blog_migrate/ad99543230f5745aa41711072594d747.png)
那我想试试自我拷贝:
![](https://i-blog.csdnimg.cn/blog_migrate/dd21428f258371b559d27fcf744231c1.png)
预期输出:1 2 1 2 3 4 5 6
实际输出:
![](https://i-blog.csdnimg.cn/blog_migrate/185ff145457fd9cd7fb92b9090b1b4b8.png)
解释:源空间和目标空间出现重叠
20.内存操作函数--memmove:
![](https://i-blog.csdnimg.cn/blog_migrate/d8b294f7f4e03dd186e6054252c70ac7.png)
①和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
②如果源空间和目标空间出现重叠,就得使用memmove函数处理
![](https://i-blog.csdnimg.cn/blog_migrate/646a307b5c5caabe1e8302838d10d26b.png)
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/a0290e17b411e571516491edd3011aac.png)
21.模拟实现memmove:
![](https://i-blog.csdnimg.cn/blog_migrate/36072bc79bfcb951ecacbf2069121ffa.png)
解释:
①覆盖拷贝所在的问题:
此处,我们就要重点注意覆盖拷贝的问题,因为会导致未被拷贝的数值已招到更改。以图为例
![](https://i-blog.csdnimg.cn/blog_migrate/050d304cf045a5002407aa2751ba186e.png)
②解决方法:
重新开辟一个空间,便于原数据的储存。
以不同的角度,以逆序拷贝or顺序拷贝以保证未进行拷贝的数据,保持原样
方法一:会有一个严重的问题,根本不知道需要开辟多大的空间(本人使用vs2019)。小了,会出现程序错误;大了,会导致空间浪费。所以在此看来,这样的不行的。
方法二:在针对不同的情形下,只要考虑完全,这就是很完美的选择,同时也不会浪费空间
③
src在dest之前:后—>前
![](https://i-blog.csdnimg.cn/blog_migrate/3b5789cb17f0dfd33e956928ab0a90f8.png)
我们可以发现自src下标小端拷贝,就不会出现之前的未进行拷贝就被更改的情况--逆顺序
dest在src之前:前—>后
![](https://i-blog.csdnimg.cn/blog_migrate/95b9c5590479da2f3fd114661ad042bf.png)
我们可以发现自src下标大端拷贝,就不会出现之前的未进行拷贝就被更改的情况——顺顺序
22.内存操作函数--memcmp:
![](https://i-blog.csdnimg.cn/blog_migrate/4337968e25588b497d4d9d54423cd670.png)
①比较从ptr1和ptr2指针开始的num个字节
②返回值如下:
str1<str2 <0
str1=str2 =0
str1>str2 >0
用法:
通过输入字节数n,比较前后两个数组从首地址开始的n个字节
![](https://i-blog.csdnimg.cn/blog_migrate/267e480fe020b1d79b11deaddd0bbebf.png)
arr1在内存中的样子:
![](https://i-blog.csdnimg.cn/blog_migrate/f4e66aaddb45bff4b7f74f57b0db390d.png)
arr2在内存中的样子:
![](https://i-blog.csdnimg.cn/blog_migrate/84760550761b55fe3d260eca2374544b.png)
当比较16个字节时,相等
![](https://i-blog.csdnimg.cn/blog_migrate/aeff3d437b136c26de52452acd0960f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dd2d4589d6fe18b1e2304cb4dc8e8a26.png)
当比较17个字节时,
![](https://i-blog.csdnimg.cn/blog_migrate/1d4a89edcb4525049777d4d7a226f18d.png)
依然是相等
原因是:在第17个字节处刚好相等(这里是小端字节序)
![](https://i-blog.csdnimg.cn/blog_migrate/f367b413af1a36504db01574166a8d8d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dcb1db9737f133ceff2dd738edbc7185.png)
当比较18个字节时
![](https://i-blog.csdnimg.cn/blog_migrate/a9e1779e2b35e32f4c744b81f0f362c2.png)
结果是-1
原因是在第18个字节处出现了不一样,arr2是33,arr1是00
![](https://i-blog.csdnimg.cn/blog_migrate/66257a2ea193c04de7fe258a0c9b7396.png)
23.内存设置函数--memset:
![](https://i-blog.csdnimg.cn/blog_migrate/8b39c04c6efe3b5e805466be5b9a8f60.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d4045851d85b9254220002c8fee90c25.png)
覆盖前:
![](https://i-blog.csdnimg.cn/blog_migrate/f925ac338ba2154ffdaa69a891f94855.png)
覆盖后:
![](https://i-blog.csdnimg.cn/blog_migrate/c09db4d3018e9dd13fcc3fc498cc96b8.png)
注:memset是以字节为单位来初始化内存的