(C语言)字符函数和字符串函数

  1. 前言

后面的内容讲解的函数有: strlen , strcpy , strcat , strcmp , strncpy , strncat , strncmp , strstr , strtok

其中strlen ->求字符串长度

strcpy ->长度不受限制的字符串函数

strcat

strcmp

strncpy ->长度受限制的字符串函数

strncat

strncmp

strstr ->字符串查找

strtok

2. 函数的认识

2.1 strlen

实现的功能:用来计算字符串的长度,在字符串中拿一个元素的地址放到函数当中,函数从这个地址开始一直向后直到遇到'\0'停止并计算从开始的地址对应的字符到'\0'(不包括‘\0’)这其中的字符个数。

函数的介绍

头文件名为<string.h>。

返回类型为size_t(无符号整型值),返回的是实际的长度,用整形表示。

string指向的是要计算长度的内容。

在使用它时有一些需要注意的地方

  1. 是以'\0'作为结束标志的,返回的是'\0'之前的字符个数(不包含'\0')。

  1. 参数指向的字符串必须要以'\0'结束。

  1. 注意函数的返回值是无符号的。

对于第3点拿出来举例

strlen("abcd") - strlen("qwethu") 对于这个内容计算的结果直接看起来是为:(-2),但是为什么结果是大于的呢?

因为当计算为(-2)时,它以补码去保存到内存中,但是因为它是一个无符号数则原反补相同,当以其原码形式化为10进制数时会得到一个非常大的正数,因此打印的是大于号。

关于strlen函数的模拟实现

第1种实现

第2种实现

第3种实现

2.2 strcpy

实现的功能:作用是复制字符串,把想复制的字符串内容复制后,放到目标数组中,但是要注意的是当把一个拷贝的字符串放到目标数组中时,但是目标数组不够大存不下这个字符串则可能会造成缓冲溢出的情况。

(正常运行时)

(当字符串目标数组存不下时)

函数的介绍

头文件名为<string.h>。

返回的类型为一个char*类型的指针,指针指向的是目标空间的起始地址

它的参数分为2部分,第1个是指向了想要接收复制内容的数组,第2个指向了要被复制的字符串。

在使用它时有一些需要注意的地方

1.源字符串必须以‘\0’结束。

2.会将源字符串中的‘\0’拷贝到目标空间。

3.目标的空间必须足够大,以确保能够把源字符串给放进去。

4.目标空间必须可变。

关于strcpy函数的模拟实现

2.3 strcat

实现的功能:追加字符串内容,它会把要追加的内容追加到对应字符串的结尾,通过这个字符串函数连接两个字符数组。

函数的介绍

头文件名为 string.h 。

它返回的类型为一个char*类型的指针,这个指针最终会指向被追加内容的字符串。

它有2个参数:第1个参数是strDestination,它指向的是目标数组(arr1)。

第2个参数strSource指向的是要追加的字符串(arr2),该字符串不会覆盖目标字符串。

在使用它时有一些需要注意的地方

1.源字符(指图中的arr2)串必须以'\0'结束。

2.目标空间必须足够大,能容纳下源字符串的内容。

3.目标空间必须可以修改。

关于strcat函数的模拟实现

2.4 strcmp

实现的功能:把2个字符串进行比较。

函数的介绍

头文件名为 string.h 。

它接收2个参数,第1个参数string1指的是进行比较的第1个字符串,第2个参数string2指的是进行比较的第2个字符串,它的返回类型为一个整数,当string1所指向的字符串大于string2所指向的字符串时会返回一个大于0的整数,当小于时,会返回一个小于0的整数,当等于时,会返回0。

在使用它时有一些需要注意的地方

  1. strcmp函数比较的不是字符串的长度,比较的是字符串中对应位置上的字符的大小,如果相同,就比较下一对,直到不同或者都遇到‘\0’,从左向右比较。

关于strcmp函数的模拟实现

2.5 strncpy

实现的功能:从源字符串(下图中的arr2)拷贝count个字符到目标空间(下图中的arr1),当源字符串中的内容小于num时,在源字符串(arr2)的后边追加0直到num个或者理解为根据提供对应的源字符串(下图中的arr2)拷贝的数量,去对源字符串内容去拷贝,拷贝后把拷贝了的内容覆盖到目标空间(下图中的arr1)中的内容上(从左向右去覆盖)。

当源字符串中的内容小于num时:

源字符串和num的数量对比,源字符串不足的内容会用0替代,而0在ASCII码表中对应的字符为‘\0’(字符串的结束标志)

函数的介绍

返回值为一个指针,这个指针指向了最终被改变了内容之后的目标空间中首元素的地址。

strDest指向了目标空间(存储改变后的内容时所要用到的空间)。

strSource指向了要被拷贝内容的字符串(源字符串)。

count表示要从源字符串中复制的字符数。

它的头文件名为 string.h。

在使用它时有一些需要注意的地方

1.注意源字符串中的字符数量和要从源字符串中拷贝内容的数量,假如从源字符串中要拷贝的数量大于源字符串中实际内容的数量时,会达不到对目标空间内容的部分覆盖的效果,因为当源字符串的内容不足时会被填0,而0在ASCII码表中对应的字符为‘\0’,要知道‘\0’是字符串结束的标志,因此最后显示的效果会达不到预期。

2.6 strncat

实现的功能:追加指定数量的内容到要被追加的字符串的结尾且还是从被追加的字符串中‘\0’的位置开始追加的,当把该追加的追加好后,还会自动追加一个‘\0’进去。

追加前:

追加后:

函数的介绍

返回一个最终指向了被赋值后的目标字符串的指针。

count为要追加的最大字符个数。

strDest指向了一个目标数组,这个目标数组指的是最后要被赋值的数组。

strSource指向了要追加的字符内容所在的数组。

头文件名为 string.h 。

2.7 strncmp

实现的功能:比较2个字符串的内容,可以设置最多比较多少个字节。

函数的介绍

头文件名为 string.h 。

string1指向了要比较的第1个字符串。

string2指向了要比较的第2个字符串。

count为要比较的最大字符数。

它的返回类型为整形,当把要比较的2个字符串中设定数量的内容进行比较时,会从左向右挨个的把对应的字符的ASCII码值拿来比较,当出现前者大于后者时,直接返回一个大于0的值,不在对后面的内容接着比,当小于时,会返回一个小于0的值,当2个字符串中要比较的内容全比完后值都相等,返回0。

2.8 strstr

实现的功能:在要被检索的字符串(arr1)中查找第一次出现小字符串(arr2)的位置,不包含终止符 '\0'。

当被检索的字符串中存在小字符串时:

当被检索的字符串中不存在小字符串时:

函数的介绍

头文件名为string.h。

返回的是在被检索的字符串中第一次检索出小字符串时,小字符串对应的首字符的地址,假如被检索的字符串中找不到完整的小字符串内容,则返回一个空指针(NULL)。

string指向了被检索的字符串。

strCharSet指向了在被检索的字符串中要搜索的小字符串内容。

关于strstr函数的模拟实现

2.9 strtok

实现的功能:通过设置分隔符,来分解字符串内容。

通过这个函数对标记所拆分成的部分内容进行部分式打印。

函数的介绍

头文件名为string.h。

返回内容指向了被分解的子字符串,如果没有可检索的字符串,则返回一个空指针。

strDelimit指向了包含分隔符的子字符串。

strToken指向了一组用标记分隔了的字符串(被用来检索是否存在与子字符串相同的内容)(可以把这个字符串看成是多个子字符串的集合,只不过用标记进行了连接)。

详细分析

1.strDelimit参数是个字符串,定义了用作分隔符的字符集合。

2.第1个参数指向1个字符串,它包含了0个或者多个由strDelimit字符串中添加的字符内容,这些字符内容定义的字符起到分隔的作用。

3.函数找到strDelimit中包含的一个标记时,将其用‘\0’替代并返回一个指向了这个标记前面字符串的首字符的地址,随后记住这个标记的位置。(strtok会改变被操作的字符串,因此在以后使用时可以拷贝一份被操作的字符串并在拷贝的内容上去使用这个函数)

4.strtok在使用时如果第一个参数不为空指针(NULL),函数则找到第一个标记并保存这个标记在字符串中的位置。

5.strtok在使用时如果第一个参数为空指针(NULL),函数则从同一个字符串中上一次保存标记的位置开始向后找另外一个标记。

6.如果不存在更多的标记则返回一个空指针。

(注意‘\0’是一个字符串的结束标志,可以理解为当找到一个标记时把它改为‘\0’,然后从首字符开始一直向后找,当找到‘\0’时意味着这个字符串到这结束了,然后记住这个标记的位置,当下一次寻找标记时则从上一个标记(即:上一个被更改为‘\0’的标记的位置)后一个字符开始接着向后找下一个标记,当把标记改为‘\0'时,标记本质上也可以理解为是查找子字符串的结束标志)。

注:有些函数后面在介绍函数所对应的头文件名时,加上了<wchar.h>,是因为在VS2022下有些函数用<string.h>执行不过去,但是用<wchar.h>却可以,所以附加上了<wchar.h>。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值