【C语言进阶篇】各类字符函数与字符串函数一览
🌈个人主页:开敲
🔥所属专栏:C语言
🌼文章目录🌼
在C语言库函数中,提供了一系列的操作字符和字符串的函数,使我们能更加方便地操作字符和字符串,一起来看看吧。(对格类字符串函数的模拟实现感兴趣的话可以看 【C语言】各类字符串函数的模拟实现-CSDN博客
对理解各类字符串函数很有帮助哦~)
1.字符函数
1.1 字符分类函数
字符分类函数顾名思义就是用来分类字符地函数,这些函数在使用的时候需要包含<ctype.h>的头文件:
1.2 字符转换函数
C语言中提供了两个字符转换函数,分别是tolower和toupper:
2.字符串函数
2.1 strlen函数
注: size_t是无符号整型
strlen函数是用于计算字符串中'\0'以前的字符数:
2.2 strcpy函数
strcpy函数用于将字符串中的内容拷贝到另一个字符串中(包括'\0'):
如果 s2 中本身就有内容,拷贝的时候将会将 s2 中的内容顶掉,例如:
(这里需要注意的是,字符串 s2 中的空间必须足够大,能够容纳 s1 全部的内容)
2.3 strcat函数
strcat函数用于将两个字符串串联:
这里串联的方式为:在 s1 中找到'\0'所在的位置,将 s2 中的内容从 s1 中'\0'的位置开始放置,直到将 s2 中的'\0'放入 s1 才停止,这也就是说,如果 s1 中手动插入了一个'\0',s2 将会从 s1 中间开始放置;同样的,如果 s2 中手动插入了'\0',在将 s2 中的内容拷贝到 s1 中时,也是无法将 s2 的内容全部拷贝进 s1,拷贝到'\0'的位置就停止了。例如:
(这里需要注意的是,s1 的空间必须足够大,同时s1、s2中必须要有'\0')
2.4 strcmp函数
strcmp函数用于字符串与字符串之间比较大小,具体比较的是字符串中字符对应ASCII码值的大小:
这里strcmp将字符串 s 与 s1 中的字符挨个进行比较,如果 s 中的某个字符大于 s1 中的对应字符将会返回一个大于0的数;反之则返回小于0的数;如果两个字符串相等,则返回0。
这里可以发现,这里的比较跟字符串的长度没关系,只要找到 s1 字符串中的一个字符大于 s 就直接判定 s1 大于 s。
2.5 strncpy函数
这个函数乍一看好像跟strcpy没什么区别啊,也就多了个n而已,但就是多的这个n,使得这个函数相对于strcpy函数更安全,为什么呢?我们先来看看多的这个n是什么,来看看cplusplus中strncpy函数的定义:
可以发现,strncpy中的n就是多了一个num,那么这个num是干什么的呢?我们先来看看strncpy用起来是怎样的:
不难发现,这里在用strncpy进行拷贝的时候,并没有像上面的strcpy那样将 s 中的内容全部拷贝进 s1 中,而是只拷贝了 s 中的4个字符进 s1,这就是num的作用。num用来限制拷贝的个数,这里将4传给了num就是让strncpy函数给我拷贝4个 s 中的字符进 s1,多一个不要,少一个不行,说4个就是4个,连'\0'都不会拷贝进 s1。
那为什么说这个函数相对于strcpy更加安全呢?来看一段代码:
这里我们想将 s 中的内容全部拷贝进 s1 里,但是 s1 的空间只有4,无法容纳 s 的全部内容,但是strcpy可不管这么多,你让我把 s 的内容全部拷贝进 s1 里,那我就全部拷贝进去呗,我管你空间够不够,这样就会导致数组越界访问。而strncpy函数在调用的时候需要传你需要拷贝的个数,这样就留下了让你思考的时间,来判断 s1 中的空间够不够,因此相对于strcpy来说,strncpy更加安全。
2.6 strncat函数
有了上面strncpy函数的参考,strncat函数理解起来也十分简单。
这里的num就是你想要串联的字符的个数,上代码:
这里我们限制串联的个数为2,那么strncat函数就将 s1 中的前两个字符ab从 s '\0'的位置串联进s。
2.7 strncmp函数
同样的,strncmp中的num就是限制比较字符的个数:
这里的代码和上面strcmp的一样,只不过将strcmp改为了strncmp。这里的 s 字符串显然是小于s1的,但是最后的结果判断成了等于,这就是因为我们限制了比较的个数,只比较了前三个字符,前三个字符都相等,那自然就会判断为相等了。
2.8 strstr函数
先来看strstr函数的使用:
strstr函数用于在一个字符串中寻找是否存在另一个字符串中的内容,如果存在,则返回另一个字符串在该字符串中第一次出现的位置。
乍一看可能看不明白,没关系,我们来慢慢分析。
首先从strstr函数的定义可以知道,这个函数的返回类型为char* 类型或者const cahr* 类型(加上const是为了保证不会修改传来的字符串,使得函数更加安全),那么我们接收的时候也是需要用char* 类型的指针或者const char* 类型的指针,指针接收的就是地址,这里的地址也就是上面所说的另一个字符串在该字符串中第一次出现的位置。
这里 s1 中的内容是 "bcd" ,s 中的内容是 "abcdefg",s1 的内容是可以在 s 中找到的,找到了以后返回的就是 s 中字符 b 的地址,因为首先匹配成功的是 b,再来看一段代码能更好理解:
这里 s1 中的内容在 s 中也能找到,而且不止一组,但是返回的时候只会返回首次匹配成功的地址,也就是第一个a的地址。
如果 s1 中的内容没法在 s 中找到,则strstr函数会返回一个空指针NULL:
如果 s1 为空字符串,则strstr函数会返回 s 的地址:
2.9 strtok函数
strtok这个函数就比较抽象了,用起来很奇怪,用的也比较少。
先来看代码:
光是看这段代码就实在是让人摸不着头脑了,这是个啥?这啥意思?别急,让我们来仔细研究。
首先创建了两个字符串,s1存放的是 "hello@world.1",s 中存放的是 "@.",然后调用了三次strtok函数,分别用三个指针来接收返回的地址。关键就在于这个函数调用是干什么的。
从打印的结果来看,不难发现,s1 中的@和.都没打印出来,而且还将hello、world和1分开来打印了,这是为什么呢?
这就是strtok的作用了,strtok函数需要两个参数,一个是char* str,在这里用于接收字符串 s ,另一个是 const char* delimiters,在这里用于接收字符串 s2,而字符串 s2 在这里可以称为 分隔符字符合集。strtok的作用就是在 s2 中读取这些字符,并记录下开始寻找分隔符的地址,然后在 s 中找到这些分隔符,随后将这些字符改为'\0',然后调用下一次函数继续往下找下一个分隔符所在位置。这里第一次调用函数找到@并将@改为了'\0',记录了开始寻找的起始地址' h ',然后返回 ' h ' 的地址。第二次调用函数继续找' . ',然后将' . '改为'\0',返回' w ' 的地址。最后一次调用函数从' 1 ' 开始找直到找完整个字符串,最后返回了' 1 ' 的地址。因此,最后将 s 中被分隔符分隔开的内容分开打印了出来。
当然,这个函数最抽象的一点就是在第二次以及之后的函数调用中,第一个参数居然传的是NULL,连个地址都不传了,这就是这个函数的用法。(当然,本人能力有限,暂时还无法解释这是为什么🤦)
2.10 strerror函数
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在C语言的库中规定了一些错误码,这些错误码一般是放在<errno.h>这个头文件中的,当我们在启动C语言程序时会使用一个全局的变量errno来记录当前程序中出错的错误码,只不过当程序刚启动的时候errno为0,表示没有出错。但是当我们使用了C语言标准库中的函数并且发生了错误时,errno就会记录下出错的错误码,这个错误码是以整数数字的形式存储的,但是当我们想要知道具体是出现了什么错误时,一个整数的数字显然没法让我们知道出现了什么错误。因此,每个错误码都对应着一段字符串错误信息,而strerror就可以将错误码对应错误信息的地址传回来。下面列举0~10错误码对应的错误信息来帮助理解:
可以看到,每一个错误码都对应着一串错误信息,而错误码0代表着没有错误。
创作不易,点个赞再走呗,谢谢啦~