目录
1.strlen()
![](https://file.jishuzhan.net/article/1758065677182177282/b06c24d62183d27885f3657b03e4bbc1.webp)
功能:用于计算字符串长度的函数,需要的参数是一个地址,得到地址之后会从这个地址开始往后找直到碰见\0,返回的是碰见\0之前统计的字符个数
strlen值得注意的点就是他的返回值是一个无符号数,可以通过这样一个代码来验证
![](https://file.jishuzhan.net/article/1758065677182177282/49540f6a427996a56ea82e09e3369bcb.webp)
按道理来说后面的比前面的字符串长,返回值不应该小于零吗,那应该打印小于等于吧,但是当我们运行之后发现运行结果居然是大于,这是因为strlen的返回值是一个无符号数,两个无符号数相减当然还是无符号数,因此打印结果是大于。如果想要判断哪个字符串长,直接这样写就行
![](https://file.jishuzhan.net/article/1758065677182177282/aa0cd7944a44f63285902e937cf56c77.webp)
如果就是要作差,把他们的返回值都强制类型转换成int类型即可
![](https://file.jishuzhan.net/article/1758065677182177282/9b3ea96dde180f33cb689f2570252bd1.webp)
模拟实现strlen()
![](https://file.jishuzhan.net/article/1758065677182177282/a5256c846de7de8e193e1abfafba2bef.webp)
2.strcpy()
![](https://file.jishuzhan.net/article/1758065677182177282/ea84f8dc598204e80c65ed5064bf3899.webp)
功能:把source指向的地址开始的字符串(包括\0)拷贝到destination指向的字符串去。
功能如图所示
![](https://file.jishuzhan.net/article/1758065677182177282/a73b082e96a82bc720bc175afeec129c.webp)
注:1.strcpy的源串必须以\0结束
2.会把源串的\0拷贝到目标空间,并不是替换掉几个字符。
3.目标空间必须足够大,确保能够放得开拷贝的字符串
4.目标空间必须可变 比如char* p="abc",这里的abc就是一个常量字符串,是不可变的。
模拟实现strcpy()
![](https://file.jishuzhan.net/article/1758065677182177282/8f47829b0987eb28c48f8f21d0b514fb.webp)
实际上这个代码可以简化
![](https://file.jishuzhan.net/article/1758065677182177282/f447176f341faceabf71b09c7996eb66.webp)
后置++,先使用,再++,直到把\0赋给*des,这时候不满足while循环的条件,因此跳出循环。
3.strcat()
![](https://file.jishuzhan.net/article/1758065677182177282/1445864ea9975909f493bbe9fbf20441.webp)
功能:把源头的字符串追加到目的串末尾。
模拟实现strcat()
![](https://file.jishuzhan.net/article/1758065677182177282/9bcf2b8a3322ac3e8b95d190fba59698.webp)
注:strcat函数不能给自己追加,从模拟实现的原理就能看出来,当我们找到des的\0时,会用*src覆盖掉\0,比如我们要在hello后面追加一个hello,des指向\0的时候src指向了h,并用w把\0覆盖掉,然后des和src都往后走一步,直到源串追加到o的时候,再往后追加没有\0了,就又追加h了,导致死循环。
4.strcmp()
![](https://file.jishuzhan.net/article/1758065677182177282/259aeaf835e4d659ad6ff5553cbb58ad.webp)
功能:比较两个字符串的大小,如果前者比后者大,返回一个大于零的值,反之返回一个小于零的值,如果二者相等就返回0。
模拟实现strcmp()
![](https://file.jishuzhan.net/article/1758065677182177282/757e4a7e07e3888f8e0aa121bbc982f3.webp)
还可以简洁一点
![](https://file.jishuzhan.net/article/1758065677182177282/a7eda97c775878b8476238d66da588bc.webp)
5.strncpy()
![](https://file.jishuzhan.net/article/1758065677182177282/c86689748a9f87c5720944c9e967150d.webp)
功能:从source拷贝num个字符到destination去,如果source指向的字符串不够num个,多出来的个数均用\0代替
模拟实现strncpy()
![](https://file.jishuzhan.net/article/1758065677182177282/7c95300449baa4abae6df5eb649e214a.webp)
6.strncat()
![](https://file.jishuzhan.net/article/1758065677182177282/379d25abbd3578b1bf22c8fc74b464ce.webp)
功能:在destination字符串第一个\0处追加num个source开头的字符。
注:1.只会追加num个,一旦追加完num个,就会自动补一个\0
2.如果source指向的字符串不足num个,在追加完source执行的字符串之后便会自动补一个\0,且只补一个。
模拟实现strncat()
![](https://file.jishuzhan.net/article/1758065677182177282/44fac7fc9c325d84cf3aecd64fe961ad.webp)
7.strncmp()
功能:比较前num个字符的大小,如果前者大就返回一个大于零的值,后者大返回一个小于0的值,相等返回0。
注:只要前num个字符相等,不管后面是什么,都会返回0
模拟实现strncmp()
![](https://file.jishuzhan.net/article/1758065677182177282/ae7d62c98d76b89580a8702bea84c83d.webp)
8.strstr()
![](https://file.jishuzhan.net/article/1758065677182177282/36bad54c49e180539ae1e64f2f5823fc.webp)
功能:在字符串str1中找字符串str2第一次出现的位置,找到了就返回这个位置,找不到返回一个NULL
模拟实现strstr()
![](https://file.jishuzhan.net/article/1758065677182177282/719e4b3d3e2d3d65108326c1e3ec63a4.webp)
思路
各变量的作用:就是先要从第一个字符开始比较,如果第一个字符相同,再比较第二个,直到找到str2。如果我们直接操作str1和str2,就会导致这两个指针指向的位置被改变,那我们在比较完一个字符发现不行,想要从下一个字符开始找的时候,就不直到从哪开始了,因为此时str1已经不知道走到哪去了。因此我们需要一个cp指针来记录这个 如果从当前位置开始无法找到str2,下一个尝试寻找的位置。并且需要一个能让我们直接操作的指针s1。(因为cp既然是记录位置的,我们就不能在比较的过程中随意操作他)又因为每次重新开始寻找str2都要让srt2从头开始,因此我们也不能直接操作str2,因此我们又创建了一个s2指针用来在比较的时候操作。
找的过程显然是一个循环,只要cp没有指向\0我们就让他继续找,找的过程中是*s1与*s2比较,如果二者相等就一直比较,直到一方出现了\0,如果*s1已经是\0但是*s2不是\0,说明str1中已经不可能找到str2,我们直接返回NULL,如果发现*s2是\0,那不管此时*s1是不是\0,都已经找到了str2,此时返回cp。如果cp都已经指向了\0,说明肯定找不到了,返回NULL(实际上只要cp指向的字符串比str2短就不可能找到了)
注:这种写法有点像暴力枚举法,效率还是比较低的。
再来介绍两个函数的功能,这两个函数相较于前面几个用的比较少,就不模拟实现了
9.strtok()
![](https://file.jishuzhan.net/article/1758065677182177282/ca9b84efdeec176d560a23c73862c506.webp)
strtok的功能及注意事项
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。也就是说这个函数内部有记录功能。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针
下面是一个使用场景
![](https://file.jishuzhan.net/article/1758065677182177282/88cccb48f3b5afa8f94a089c1bec5862.webp)
当然这种场景是因为我们知道了字符串是什么,有几个分割符。如果想要一般性的调用,可以这样写
![](https://file.jishuzhan.net/article/1758065677182177282/1baa416e26297d604ea274febf837e32.webp)
10.strerror()
库函数执行发生错误的时候会把一个错误码放在errno这个变量中,errno是C语言提供的一个全局变量。
每个错误码都有其对应的信息。我们可以打印一下看看
![](https://file.jishuzhan.net/article/1758065677182177282/190de8f70e9618f0a2e716b5bb01e6fc.webp)
strerror函数返回的是错误码所对应字符串的首字符地址。