【C 语言】字符函数 & 字符串函数 & 内存函数(下)[进阶篇 _ 复习专用]
💛 前情提要💛
本章节就进入 C 语言的核心:深度剖析 C 语言库函数中的字符串函数
和内存操作函数
C 语言中对字符和字符串的处理很是频繁,但是 C 语言不像 python,本身是没有字符串类型的,所以字符串通常放在
常量字符串
中或者字符数组
中。
字符串常量
适用于那些对它不做修改的字符串函数.
接下来我们即将进入一个全新的空间,对代码有一个全新的视角~
以下的内容一定会让你对 C 语言有一个颠覆性的认识哦!!!
以下内容干货满满,跟上步伐吧~
作者介绍:
:mortar_board: 作者: 热爱编程不起眼的小人物:goat::mag_right:作者的 Gitee:代码仓库:pushpin:系列文章推荐:
:ledger:我和大家一样都是初次踏入这个美妙的“元”宇宙:earth_asia: 希望在输出知识的同时,也能与大家共同进步、无限进步:star2:
@TOC
💡本章重点
字符串查找系列函数
错误信息报告函数
字符操作函数
内存操作函数
🍞一.字符串查找系列函数
🥐Ⅰ.strstr 函数
我们需要注意:
💡strstr
函数的工作原理:在一个字符串中查找另外一个字符串【即判断一个字符串是否为另外一个字符串的子串】
函数的形参为:主串的字符串的起始地址、需要被查找的字符串的起始地址(子串)
函数的返回类型为:char*
❗有了以上了解,从中得出两个点:
1️⃣在 str1 所指向的字符串中判断 str2 所指向的字符串是否为 str1 的子串【即在主串中判断是否有这个子串】
2️⃣函数的返回值:
当在
str1所指向的字符串
中查找到str2所指向的字符串
时,返回一个在 str2 在 str1 中第一次出现的地址如果在 str2 在 str1 中查找不到,则返回一个 NULL
👉strstr
函数的模拟实现:
思路:
💫为了在函数的查找过程中找到子串时,能返回一个子串在主串中第一次出现的地址,我们需要设置两个指针:
❗一个指针负责
走
【当在主串中找到与子串第一个字符相等的时候,继续往后判断剩余的字符】❗一个负责
存
【存储子串第一次在主串出现的地址,这样才能返回子串在主串中第一次出现的地址(即子串在主串中的起始地址)】
🥐Ⅱ.strtok 函数
💡strtok
函数的作用:简单来说就是通过在字符串中查找分隔符从而达到字符串分割的效果
函数的形参分别为:要被分割的字符串的起始地址、分隔符的字符集合的起始地址
sep
参数是个字符串,定义了用作分隔符的字符集合str
(第一个参数)指定一个字符串,它包含了 0 个或者多个由 sep 字符串中一个或者多个分隔符分割的标记函数的返回类型为:char*【被分割出来的字符串的起始地址】
➡️strtok
函数的工作原理:
strtok 函数会在 str 指向的字符串中找到 sep 集合中的标记(分隔符),并用
\0
替代这个标记,返回一个被分割出的这段字符串的起始地址
❗有了以上了解,可以从中得出三个点:
1️⃣strtok 函数的第一个参数
不为 NULL
时,函数将找到 str 中第一个标记,strtok 函数将保存它在字符串中的位置【即保存了在这个标记符时的位置,就不往后找了】2️⃣strtok 函数的第一个参数为
NULL
,函数将在同一个字符串中被保存的位置开始,查找下一个标记3️⃣如果字符串中不存在更多的标记,则返回
NULL
指针【即已经全部分割完的时候,就返回NULL
】
💥特别注意:
strtok 函数会改变被操作的字符串,所以在使用 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改
👉示例:
我们现在需要分割一个字符串:“My email address is:Dream_Y-ocean@CSDN.com”
我们想将每个单词都分割出来
Eg:“My”、“email”、“address”……
我们便需要:
分割字符集合:
:
、@
、.
拷贝被分割的字符串:
strcpy
函数
但上面的代码会不会显得冗余呢🤔
我们能不能再优化一下呢~
答案是可以的!!!
我们可以用
for循环
所以我们要好好利用好for循环
哦~~
🥯Ⅲ.总结
✨综上:就是字符串查找系列函数
➡️简单来说:就是以分割、查找…对字符串进行操作的函数
🍞二.错误信息报告函数
🥐Ⅰ.strerror 函数
💡strterror
函数的作用:将错误码这个整型里的错误码翻译成错误信息
函数的参数为:int【即参数一般为
errnno
】errno 相当于 C 语言设置的一个全局变量,用来专门存储全局的错误码
即只要程序调用失败,程序就自动把错误吧存储到 errno 这个变量中
函数的返回类型为:char*
👉示例:
🥐Ⅱ.perror 函数
💡perror
函数的作用:与strerror
函数一样,将错误信息翻译出来,并打印出来
函数的参数为:填入想打印的字符串
函数的返回类型:void
➡️perror
函数的工作原理:可以理解为 perror 将 strerror 函数内置在里面,并一并将其打印出来
即程序调用失败的时候,perror 先将程序员输入的
字符串
打印出来,然后程序自动加上并打印:
,再把错误信息打印出来
👉示例:
🥯Ⅲ.总结
✨综上:就是错误信息报告函数
➡️简单来说:就是可以把错误信息打印出来的函数
🍞三.字符操作函数
🥐Ⅰ.字符分类函数
🥐Ⅱ.字符转换函数
🥯Ⅲ.总结
✨综上:就是字符操作函数
➡️简单来说:就是对字符进行操作判断的函数
🍞四.内存操作函数
🥐Ⅰ.memcpy 函数
💡memcpy
函数的作用:通过一个一个字节的方式去实现内存拷贝
函数参数类型为:拷贝目标的起始地址、拷贝源的起始地址、拷贝的数据大小【单位:字节】
函数返回类型为:void*
➡️memcpy
函数的工作原理:对字节实现类似 strcpy 函数的操作,一个一个字节的拷贝
❗有了以上了解,可以从中得出一个点:
函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置
💥特别注意:
1️⃣这个函数在遇到
\0
的时候并不会停下来【不像strcpy
函数】2️⃣如果 source 和 destination 空间上有任何的重叠,复制的结果都是未定义的【即如果空间重叠的时候会影响拷贝】
👉示例:
初始化数组,想将数组内的
1,2,3,4,5
替换到3,4,5,6,7
的位置上拷贝后:
却发现想拷贝的数据被
修改
了❗
💫综上:memcpy
的拷贝应避免重叠的内存空间
👉函数的模拟实现:
思路:
因为函数是用
void*
指针去接收地址的,所以传什么类型都可实现 memcpy 函数的通用函数的实现大致与
strcpy
函数的实现一致,仅仅细微不同
🥐Ⅱ.memmove 函数
💡memmove
函数的作用:与memcpy
函数的功能一样,但此函数可以实现拷贝重叠的空间
函数参数类型为:拷贝目标的起始地址、拷贝源的起始地址、拷贝的数据大小【单位:字节】
函数返回类型为:void*
❗有了以上了解,可以从中得出两个点:
1️⃣与
memcpy
的差别就是memmove
函数处理的源内存块和目标内存块是可以重叠的2️⃣如果源空间和目标空间出现重叠,就得使用
memmove
函数处理
👉函数的模拟实现:
思路:
将
void*
强制转换类型成char*
可以将函数实现更多操作更多类型、普适性更强
【Eg:只强制类型转换成int*
那一次性就要访问4个字节
的内容,如果想拷贝1个字符
(即 1 字节),就会把本来不想拷贝的也拷贝了】
🥐Ⅲ.memcmp 函数
💡memcmp
函数的作用:与strcmp
函数的功能一样,只不过是对所有类型都进行一个字节一个字节的比较
➡️ memcmp
函数的工作原理:与strcmp
的原理一样~只不过是对内存进行比较
❗了解以上知识后,函数的返回值之所以为整型
,是因为:
1️⃣若
ptr1
<ptr2
,则返回<0
的数字【在 VS 编译器下,返回值为-1
】2️⃣若
ptr1
=ptr2
, 则返回0
【在 VS 编译器下,返回值为0
】3️⃣若
ptr1
>ptr2
, 则返回>0
的数字【在 VS 编译器,返回值为1
】
🥐Ⅳ.memset 函数
💡memset
函数的作用:在 ptr 指向空间的前num个字节
内容改 我们指定value
的内容
函数参数类型为:一个指向想被修改内存空间的地址、想修改成的指定内容(整型)、修改的内存空间大小
函数的返回类型:void*
➡️ memset
函数的工作原理:类似于memcpy
的工作原理,将前 num 个字节的内容修改成 value 的内容
👉示例:
对想要修改的空间进行初始化
这样就成功将前
20个字节
修改为1
🥯Ⅴ.总结
✨综上:就是内存操作函数
➡️简单来说:就是内存函数都可以理解为微观视角
【对内存空间(字节)进行操作】
🫓总结
综上,我们基本了解了 C 语言中的“字符串函数和内存操作函数”:lollipop:的知识啦~~
恭喜你的内功又双叒叕得到了提高!!!
感谢你们的阅读:satisfied:
后续还会继续更新:heartbeat:,欢迎持续关注:pushpin:哟~
:dizzy:如果有错误❌,欢迎指正呀:dizzy:
:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles:
版权声明: 本文为 InfoQ 作者【Dream-Y.ocean】的原创文章。
原文链接:【http://xie.infoq.cn/article/a70aa390fd3655ceb5e292b02】。未经作者许可,禁止转载。
评论