字符函数和字符串函数的介绍

字符在C语言里是必不可少的一个重要组成部分,但我们不可能每次都只使用ASCII码对其进行操作,那样过于麻烦了,因而,C语言为我们提供了更方便的字符函数及字符串函数。

一、字符函数

(1)字符分类函数

正如其名字所述,字符分类函数用于判断输入的数据是哪类字符。需要头文件<ctype.h>

当然,模拟实现原理(因为我们不知道该函数的背后的真实实现,我们只能用C语言代码来模拟实现)也比较简单,我们可以不用记。

举个例子,islower函数是判断a~z的函数。我们可以用:

if(c <= 'z' && c >= 'a')的一个判断语句来代替。

当然也可以用z和a的ASCII码对应代替。

(2)字符转换函数

C语言提供了两个字符转换函数,同样需要头文件<ctype.h>来引用。

输入一个字符进去,tolower和toupper函数帮助将大写转小写/小写转大写。

我们同样可以模拟实现。

比如tolower函数:

if( c <='z' && c>='a') c+=32;

实在记不住大小写ASCII码相差多少,可以写成 c+='a'-'A';(a是97,A是65)

(3)字符串函数

strlen

strlen函数是我们计算字符串长度的好帮手,经常出现在函数中开辟数组时,计算数组大小(动态内存的时候可以用malloc)

需要头文件<string.h>

strlen函数计算字符串遇到第一个\0之前的个数,换句话说,字符串里有\0的时候,统计个数会小于真正的长度(但正常人不会在里面放个\0)

strlen函数我们已经很熟悉了,但是有一个易错点必须知道,strlen函数返回值是size_t,而非我们想的int。

strlen的几种模拟实现:

(assert部分是为了防止传空指针,const是为了防止修改指向字符串的内容)

(还是首推上面一种方式,只需一次遍历就可,下面这种递归的形式只有变态考官才会这么问你,实际操作中远不如第一种方式)

strcpy

strcpy函数用于将字符串的内容拷贝到另一个指定目的地内部。

我们需要保证的是:

源字符串(source)必须有\0,且被拷贝到目的地内。

目的地有足够的空间储存这些字符串的内容,包括\0。

目的地必须可以修改。(如果将目的地指针指向常量字符串,此刻就无法修改,尽管我们都是使用数组来进行储存的,但是这种情况必须警惕)

strcat

strcat函数用于将字符串的内容追加到另一个指定目的地的尾部。与strcpy所需参数一致。

我们需要保证的是:

源字符串(source)必须有\0,且被拷贝到目的地内。

目的地有足够的空间储存这些字符串的内容,包括\0。

目的地必须可以修改。

除此之外,还需要将目的字符串的\0删去(也就是将源字符串的第一个字符代替目标字符串的\0)

strcmp

strcmp函数用于比较两个字符串大小,比较规则是一一对应(根据ASCII码比较)。

a字符串的第一位和b字符串的第一位比较,有大小之分则直接返回大于0的值或是小于0的值(如果a字符串>b字符串,则返回大于0的,反之返回小于0的。在VS里,将会直接返回1和-1)

如果相同,则继续比较两者的第二位。直到分出大小,或是哪一个字符串先被比较完,此时还有多余字符的字符串更大。如果两者长度相同,且无法分出大小,则会返回0。

博主现在能想到的应用就是password看是否正确的时候会用到。当然肯定存在更多的实践。

strncpy和strncat、strncmp

对比strcpy和strcat函数,两者多了个n,实际上就是为了增加函数的可控性。

我们可能只想粘贴几个字符进去,或者我们事先知道目标空间不足以放入全部字符,我们选择放入部分字符进去,这个时候多出的n就采取了作用。

相比较strcpy以及strcat函数,需要多一个类型为size_t的参数传入。

而strncmp也是只比较指定数目个字符。

strstr

strstr函数用于检测str2在str1中的位置(不会匹配\0),否则传递NULL。

应用有二:

1、就如返回的char*指针一般,用于定位str2的位置。

2、检验str2是否存在于str1里。

strtok

sep指向一个定义为分隔符的集合

strtok函数用于指向这些分隔符,并会返回这些分隔符的地址(一个一个传回,再次使用将找第二个分隔符,如果找不到,将会直接返回NULL)

注:strtok函数会改变str字符串(会将分隔符的位置转变为\0,所以使用strtok函数时一定要临时拷贝且可修改的字符串,以防修改到原字符串身上)

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值