本文包括以下几部分内容:
一.strlen、strcpy、strcat、strcmp函数的使用和模拟实现
二.strncpy、strncat、strnmp函数的使用
三.strstr函数的使用和模拟实现
四.strtok、strerror、perro函数的使用
函数的模拟实现可以帮助可以帮助我们更加深刻的理解函数,方便我们去使用今天来介绍有关于字符的相关函数,希望对大家有所帮助。
一.strlen、strcpy、strcat、strcmp函数的使用和模拟实现
1.strlen函数的使用和模拟实现
1.1strlen函数的返回值与传参
这里有几个注意事项:
1.返回值为size_t类型(无符号整型)所以在比较大小是要注意,例如:
此时结果为无符号的整形为3所以打印的是大于零,而不是小于零,所以对于size_t类型的值进行运算时要注意符号
2.字符串必须要以"\0"结束否则会越界访问
3.要包含<string.h>的头文件
使用则比较简单将字符数组或字符传入即可
1.2strlen的模拟实现
这里有三种方式,其中两种要创建临时变量而剩下的一种则不用创建临时变量
1.2.1计数器的方式实现
这里使用while循环不断使指针向后移动,直到遇到字符串0时结束,将数值返回
1.2.2指针-指针的方式实现
这里将字符的指针传过来后新建一个指针将其接收,然后将一个指针找到’\0’后让两个指针相减就能得到中间的字符个数
1.2.3不创建临时变量(函数的递归)
这里通过函数的递归实现如果不是’\0’则加1并再次调用自身可以避免去创建临时变量
2.strcpy函数的使用和模拟实现
2.1strcpy的使用
这个函数可以实现字符串的拷贝,其中2为要拷贝到的地方,3为要拷贝的内容,1为返回类型
这个函数要注意:
1.源字符串必须要以’\0’结束,因为拷贝的内容放到’\0’后
2.拷贝的目标空间要足够大,并且可以修改
使用方法很简单但这里我们打开调试观察它是如何放置的
这里可以发现这个函数将提供的字符串前面替换掉让后将’\0’也拷贝过来了,了解到这我们就可以去模拟实现了
2.2strcpy的模拟实现
这里我们可以看看一串代码是如何从写出来到后续优化的
调试结果:
可以发现这样也可以满足要求了但还可以优化一下
这里优化了两个地方:
1.要拷贝的内容不能被更改所以加上const限制
2.进行断言防止传过来的是空指针
但还可以改进:
这里创建ret是为了将str1将字符的第一个数组记录下来,当后续完成时将其返回
这里的while语句是将之前的合并到一起了,这里++的优先级比*高所以要用后置++,当str2为"\0"(ASCLL码值为零)while循环会结束
3.strcat函数的使用和模拟实现
3.1.strcat函数的使用
简单来说strcat函数的用来连接字符串的
这里要注意:
1.目标空间要足够大,并且可以修改
2.两个字符串都要以"\0"结尾,其实就是要知道从哪里开始,从那里结束
3.2.strcat函数的模拟实现
1.这里将两个不为NULL改为&&其原因是NULL的ASCLL为0,如果两个有一个为0就会断言,将其放在一起判断也是可以的
2.这里通过while循环找到"\0"
3.和上面一样,将str2地值赋给str1
4.strcmp函数的使用和模拟实现
3.1.strcmp函数的使用
这个函数之前提到过,比较两个字符串上对应的ASCLL码值如果第一个字符串大则返回>0的数,反之则是<0的数,相等返回0
3.2.strcmp函数的模拟实现
while循环判断两者是否相等,如果相等且有一个是"\0"直接返回0不相等则进行if判断,进行返回
也可以写成:
这样返回值的就不是1,0,-1这三个数了而是>0,0,<0的数了
二.strncpy、strncat、strnmp函数的使用
1.strncpy、strncat、strnmp介绍
这几个函数都有一个共同的特点:在原来的函数上多了一个参数,而这个参数是对这几个函数进行限制的
2.strncpy、strncat、strnmp使用
2.1strncpy的使用
这里可以发现如果拷贝的字符串小于num会在后面追加0直到num个
2.2strncat的使用
2.3strncmp的使用
三.strstr函数的使用和模拟实现
1.strstr函数的使用
简单来说在字符串中查找另一个字符串是否出现,如果出现就返回出现第一次的位置,否则就返回空指针
2.strstr函数的模拟实现
这里处理这种情况:
在abbbcdef 找 bbc 要多次匹配的情况
这里通过两个while嵌套的循环来解决这个问题
外循环当cp将字符串str1遍历完结束并创建s1,s2指针分别指向str1现在遍历的位置和str2的头部
内循环如果此时s1和s2指向的字符一样两者同时++进行接下来的判断
不相同则跳出此次循环是cp+1并再次进行循环
后续补充为如果两者有任意的一个判断完了跳出循环返回结果,其中如果将s2判断完了就代表找到了返回此下时指向的位置即cp,否则就返回空指针
1.这里是一个特殊场景的处理:传入的是空字符串时直接返回
2.找不到时返回空指针不能直接打印就要进行判断
这里的实现方法仅供参考,还有很多可以优化的地方
四.strtok、strerror函数的使用
1.strtok函数的使用
这里先给大家看一下效果
不难理解,就是将字符串按照分隔符进行分割,而再次调用时不需要传入原本的参数,传入空指针即可
这时巧妙地将判断条件放入到for循环中去进行循环打印
2.strerror、perro函数的使用
可以将错误信息返回的函数,需要包含<errno.h>头文件
例如这里打开文件的代码目录下并没有这个文件就可以使用strerror将错误信息返回
与其相似的函数perror会优先将输入内的字符串打印后加上:在打印错误信息
以上就是文章的全部内容,希望对大家有所帮助,后面时全部的代码,也可以去gitee自取
大家加油!!!
C语言函数可以在legacy.cplusplus.com查看学习