C语言中的字符串函数

下面相关的C语言库函数头文件均是:<string.h>,包括以下函数:

目录

求字符串长度 

strlen

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

strcmp:

strcpy:

strcat:

长度受限制的字符串函数

strncmp:

strncpy:

拷贝的字符串长度 小于或等于源字符串长度

拷贝的字符串长度大于源字符串长度

strncat:

要拼接字符串的长度小于或等于源字符串

要拼接字符串的长度大于源字符串

 查找字符串

 strstr

strtok

 错误信息报告

strerror  


求字符串长度 

  • strlen

size_t strlen ( const char * str );  

strlen函数最为十分常用的一个库函数,其作用是只能用来求一个字符串的长度,统计字符串’\0‘前的字符个数,单位是字节,其返回值为无符号的类型,这个需要我们特别注意 ,由于其返回值是无符号的类型,通过由strlen得到的字符串长度值相减也都为正数,不会出现负数情况,所应当避免通过其返回值做差来比较两个字不同符串长度。

 如:

上述代码arr1、arr2作为参数传递到strlen函数中,均是以第一个字符的地址为起点开始统计字符串长度,其中由于arr2中为数组,其元素中没有字符串结束标志’\0‘,导致strlen函数统计arr2得到结果为随机值42(由于没有’\0‘,要统计到d之后的字符,使用得到结果可能为大于4的任意值),而arr1中字符串末尾默认添加一个结束字符’\0‘,得到确切结果。

 上述代码这个结果就能很好的反映出strlen函数的返回值是无符号类型的,两个strlen函数计算arr1,arr2的长度得到两个无符号的数,其做差结果也为无符号类型的,所以得到的结果一定是不小于0的。

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

strcmp:

int strcmp ( const char * str1, const char * str2 );  

strcmp函数是用于比较两个字符串大小的,其比较方法是开始通过比较两个字符串的第一个字符大小,(这个大小对应是ASCLL码表中的大小),若相同则继续比较下一个字符串,如果比较完后仍然未分出大小,则比较的两个字符串相等,否则返回0,如果比较出结果为字符串str1大于字符串str2,则返回1,相反,小于则返回-1。

了解到strcmp函数的使用方法,下面让我们来看一段代码:

 正如上面所说,第一个结果比较时,前两个字符是相等的,比较到第三个字符后,发现字符d要大于字符c所以返回值结果为-1,同理第二个结果,此时两个字符串是相等,直到比较完后仍然未分出大小,最后返回值为0,第三个结果,我们发现,两个字符串比较时,字符“abc”比较完了仍然未分出大小,但是,字符串arr仍然有字符d可以与字符串“abc”后的字符串结束符'\0'比较,而‘\0’在ASCLL码表中所对应的值为0,是最小的,所以字符串arr自然是要更大,最后的返回值为1。  

strcpy:

char* strcpy(char * destination, const char * source );
strcpy函数是用于将一个字符串复制拷贝到另一个字符串当中,需要注意的是,strcpy函数的第二个参数字符串,需要有字符串结束符‘\0’,否则拷贝会失败,因为拷贝的结束需要靠字符串结束标志'\0'来识别是否拷贝结束,拷贝时会将‘\0’一同拷贝要待拷贝的目标空间中,此外,待拷贝的目标空间必须是可修改的,并且要足够的大,才能够存储下要拷贝的字符串。 其返回值为目标空间的地址。
看以下代码:

 看上面的代码,我们会发现arr1中存放的字符串与strcpy函数的返回值是一样的,此外通过调试我们可以发现,字符串的拷贝将arr2中的‘\0’一同拷贝到arr1中,如下图。

strcat:

char * strcat ( char * destination, const char * source ); 

strcat函数是用来将一个字符串接长到另一个字符串当中,与strcpy函数类似,strcat函数中所传递的第二个参数字符串也必须要有字符串结束字符‘\0’否则接长将失败,这也是因为,字符串的拼接的结束需要靠‘\0’来判断是否结束,此外,strcat函数的目标空间,也必须是可修改的且空间足够大的,以达到存储要接长字符串的目的 。其返回值为目标空间的地址。另外,需要注意的是,srcat函数不能够追加有重叠空间的字符串。

看以下代码: 

strcat函数返回值与strcpy相同,都是返回目标空间地址,使用指针变量ret接收strcat返回值会发现,与调用函数后的接长字符串arr1相同。

长度受限制的字符串函数

下面三个函数和与上面的长度不受限制的字符串函数只相差了一个字母n,但是在使用方面确显得更加安全。

strncmp:

int strncmp ( const char * str1, const char * str2, size_t num );
与strcmp相比较,strncmp多了一个参数,两个函数大致作用是相同的,都是比较字符串的长度,比较结果的返回值也是相同的,当第一个字符串大于第二个,返回整数1,相同则返回0,小于则返回0不同的是这 第三个参数限制了比较两个字符串可比较的长度。让我们一起来看一看吧。
看上面的代码,我们发现正常情况下调用函数strcmp比较arr1和arr2 所存储的字符串长度,是arr1要大于arr2,所以返回值结果为1,我们再看strncmp函数的比较结果,首先给strncmp函数传递参数6,使其最多比较两个字符串前6个字符,而在这6个字符的比较中,当比较到第5个字符时,arr1中的字符要大于arr2中的,所以最后返回值结果也为1,再看第三个结果,我们发现strncmp中第三个参数为4,也就是最多比较arr1和arr2中前4个字符,而我们发现两个字符串中前4个字符时相同的,最后结果自然为返回0。

strncpy:

char * strncpy ( char * destination, const char * source, size_t num );

strncpy函数与strcpy相同,也是复制拷贝一个字符串到另一个字符串当中,不同的是,第三个参数限制了需要拷贝字符的个数,其返回值也为目标空间的地址。使用时有一些细节需要我们注意,下面让我们先看几段代码。 

拷贝的字符串长度 小于或等于源字符串长度

这里拷贝字符串的字符串的长度限制为6,不出意外的拷贝了字符串arr2中前6个字符到arr1中。

拷贝的字符串长度大于源字符串长度

 此时把拷贝字符串的长度限制为7,要拷贝的长度恰好比arr2中的字符串要长出1,而这一个字符串刚好将arr2后面的 ‘\0’拷贝到了arr1中,最后打印出的结果也就能很好解释。

可以看到,此时要拷贝的字符串的长度被限制为8,但是我们发现要拷贝的字符串arr2中长度并没有8,但是结果却与限制为7的结果一致,我们知道arr2中字符串长度为6,后面一个字符结束标志为‘\0’,是固定的,但‘\0’往后的字符是随机的,而由于这种随机的字符是不确定,strncpy函数在处理拷贝大于源字符串长度的时候,首先会把源目标字符串全拷贝到目标空间中,然后将剩余不足的长度全用‘\0’代替补齐。我们可以通过调试看到字符F后紧接着的是两个‘\0’。但要注意的是,要拷贝的字符串虽然可以大于源目标字符串大小,但是确不能大于目标空间的大小,否则目标空间存储不下,会导致越界非法访问空间。

strncat:

char * strncat ( char * destination, const char * source, size_t num );

strncat函数在strcat的基础上同样限制了在要拼接字符串的长度,其返回值同样是目标空间的地址。让我们看下面几个代码

要拼接字符串的长度小于或等于源字符串

 上面的代码限制要拼接的字符串长度为3,小于源字符串arr2的长度4,在字符串arr1后拼接3个字符ABC到arr1中最后得到上面的结果。

要拼接字符串的长度大于源字符串

 

这里为了能更好的判断拼接的字符串,在arr1中间加了字符串结束标志‘\0’,strcat或strncat函数的机理都是在找到目标空间的‘\0’后开始拼接,我们可以看到,上面代码限制拼接的字符串长度为6,要大于arr2的长度4,但是我们发现最后的结果仍然是拼接上了arr2中的全部字符,与strncpy函数有所不同,使用strncat函数时,当要拼接的字符串大于源字符串长度时,其并不会拼接不够的长度,无论要拼接的字符串长度为多少,只要是大于源目标字符串长度,就只拼接源字符串的全部字符,然后再在其最后补上一个字符‘\0’,可以通过调试看到拼接完后的字符串arr2最后追加了一个字符‘\0’。

 查找字符串

 strstr

char * strstr ( const char *str1, const char * str2);

strstr函数是用于查第二个参数字符串str2是否为第一个参数字符串str1的子串,所谓子串就是有着相同部分的字符串,其返回值:如果字符串str2为字符串str1的子串,则返回str1中第一次子串出现的起始地址,如果不为子串,则返回一个空指针NULL

让我们来看以下代码:

可以看到,对于第一个结果,将字符串“bc”传递为参数用于判断是否为arr的子串,我们发现,"bc"为arr的子串,指针变量ret1接收到字符"bc"第一次出现在arr中的地址,最终得到上面的结果,而对于第二个结果,我们发现,参数字符串“bce”在arr中没有出现相同的部分,不为arr的子串,最终返回结果为空指针。

strtok

char * strtok ( char * str, const char * sep );
strtok函数是用于将字符串str中的字符串分割成若个子串,sep也为一个字符串,用于定义字符串str分割的标记,由若干个标记字符组成,strtok函数从str中寻找到sep中所包含的字符,找到后将该位置处后的字符以‘\0’结尾,要注意的是strtok函数会改被操作字符串中的字符,所以在使用strtok函数时,一般使用一个变量拷贝要操作的字符串,strtok的返回值:如果第一个参数不为NULL时,strtok函数将查找到sep中所包含的字符,找到存在的第一个标记,并且保存当前所标记的位置;如果第一个参数为NULL时,strtok函数将在同一个字符串中之前保存好的位置开始往下查找标记,如果不存在标记,则返回NULL指针。

 看以下代码来帮助理解:

 

  可以看到,sep中包含了三个用于分割字符串的标记字符,分别是'#'、'*'以及'.'。依次调用5次strtok函数,分别用指针变量ret1、ret2、ret3、ret4、ret5来接收函数返回值,先使用copy将arr中的字符串拷贝下来,然后将copy作为参数第一次调用strtok函数,找到sep中所包含的第一个标记‘*’,保存此处标记的位置,然后使用‘\0’结尾,返回该段字符串,不出意外的ret1接收打印的结果为第一处被分割的字符串“ab”,而copy由于被strtok函数的调用,其字符串的内容也发生了改变,再来看第二次对strtok函数的调用,此时函数的第一个参数为NULL,strtok函数将从第一次调用时所保存的标记位置向后查找新的标记,此时找到了标记字符‘#’,再次保存所标记的位置,将该段字符串以‘\0’结尾,返回该段字符串的起始位置,最后ret2所接收打印的结果为“cd”,后面两个ret3,ret4的打印结果同理,来看最后一个ret5的打印结果为NULL,这是因为在第四次调用完strtok函数后字符串中没有更多的标记,最后ret5所接收的则为NULL。

下面是一种更加方便的使用方法:


结语:

本期关于库函数的相关知识到这就介绍完了,如果感觉对你有帮助的话还请点个赞支持一下!有不对或者需要改正的地方还请指正,感谢各位的观看。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值