目录
1.strlen()
模拟实现strlen()
2.strcpy()
模拟实现strcpy()
3.strcat()
模拟实现strcat()
4.strcmp()
模拟实现strcmp()
5.strncpy()
模拟实现strncpy()
6.strncat()
模拟实现strncat()
7.strncmp()
模拟实现strncmp()
8.strstr()
模拟实现strstr()
9.strtok()
strtok的功能及注意事项
10.strerror()
1.strlen()
功能:用于计算字符串长度的函数,需要的参数是一个地址,得到地址之后会从这个地址开始往后找直到碰见\0,返回的是碰见\0之前统计的字符个数
strlen值得注意的点就是他的返回值是一个无符号数,可以通过这样一个代码来验证
按道理来说后面的比前面的字符串长,返回值不应该小于零吗,那应该打印小于等于吧,但是当我们运行之后发现运行结果居然是大于,这是因为strlen的返回值是一个无符号数,两个无符号数相减当然还是无符号数,因此打印结果是大于。如果想要判断哪个字符串长,直接这样写就行
如果就是要作差,把他们的返回值都强制类型转换成int类型即可
模拟实现strlen()
2.strcpy()
功能:把source指向的地址开始的字符串(包括\0)拷贝到destination指向的字符串去。
功能如图所示
注:1.strcpy的源串必须以\0结束
2.会把源串的\0拷贝到目标空间,并不是替换掉几个字符。
3.目标空间必须足够大,确保能够放得开拷贝的字符串
4.目标空间必须可变 比如char* p="abc",这里的abc就是一个常量字符串,是不可变的。
模拟实现strcpy()
实际上这个代码可以简化
后置++,先使用,再++,直到把\0赋给*des,这时候不满足while循环的条件,因此跳出循环。
3.strcat()
功能:把源头的字符串追加到目的串末尾。
模拟实现strcat()
注:strcat函数不能给自己追加,从模拟实现的原理就能看出来,当我们找到des的\0时,会用*src覆盖掉\0,比如我们要在hello后面追加一个hello,des指向\0的时候src指向了h,并用w把\0覆盖掉,然后des和src都往后走一步,直到源串追加到o的时候,再往后追加没有\0了,就又追加h了,导致死循环。
4.strcmp()
功能:比较两个字符串的大小,如果前者比后者大,返回一个大于零的值,反之返回一个小于零的值,如果二者相等就返回0。
模拟实现strcmp()
还可以简洁一点
5.strncpy()
功能:从source拷贝num个字符到destination去,如果source指向的字符串不够num个,多出来的个数均用\0代替
模拟实现strncpy()
6.strncat()
功能:在destination字符串第一个\0处追加num个source开头的字符。
注:1.只会追加num个,一旦追加完num个,就会自动补一个\0
2.如果source指向的字符串不足num个,在追加完source执行的字符串之后便会自动补一个\0,且只补一个。
模拟实现strncat()
7.strncmp()
功能:比较前num个字符的大小,如果前者大就返回一个大于零的值,后者大返回一个小于0的值,相等返回0。
注:只要前num个字符相等,不管后面是什么,都会返回0
模拟实现strncmp()
8.strstr()
功能:在字符串str1中找字符串str2第一次出现的位置,找到了就返回这个位置,找不到返回一个NULL
模拟实现strstr()
思路
各变量的作用:就是先要从第一个字符开始比较,如果第一个字符相同,再比较第二个,直到找到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()
strtok的功能及注意事项
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。也就是说这个函数内部有记录功能。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针
下面是一个使用场景
当然这种场景是因为我们知道了字符串是什么,有几个分割符。如果想要一般性的调用,可以这样写
10.strerror()
库函数执行发生错误的时候会把一个错误码放在errno这个变量中,errno是C语言提供的一个全局变量。
每个错误码都有其对应的信息。我们可以打印一下看看
strerror函数返回的是错误码所对应字符串的首字符地址。