字符函数与字符串函数
导言
大家好,很高兴又和大家见面了!!! 从咱们学习C语言的开始,我们就接触了一个数据类型——字符类型。并且在之后的学习过程中,我们经常与这一类型的元素打交道,如字符变量、字符数组、字符指针……
与这些类型密切相关的就是字符与字符串,我们经常要对这些字符和字符串进行一些操作,如字符小写转大写、判断是不是小写字符、计算字符串长度……
为了方便程序猿来处理这些字符和字符串,C语言为程序猿提供了一系列的库函数,这就是我们今天要介绍的字符函数与字符串函数;
一、字符分类函数
字符,可以简单的理解为只要是键盘上能敲出来的都是字符,前面我们有介绍一个内容——ASCII码表。
从表中我们可以看到这里面的字符有各式各样的,这些字符分为两大类——控制字符与打印字符。而打印字符又分为数字字符、标点符号、小写字符、大写字符……对于这些字符,C语言中有一系列的函数是专门做字符分类的函数,也就是一个字符时属于什么类型的函数,下面我们就来看一下都有哪些:
代码语言:javascript复制iscntrl——判断是不是控制字符
isspace——判断是否为空白字符
isdigit——判断是否是数字字符
isxdigit——判断是否是十六进制数字字符
islower——判断是否是小写字母
isupper——判断是否是大写字母
isapha——判断是否是字母
isalnum——判断是否是字母或者数字
ispunct——判断是否是标点符号
isgraph——判断是否是图形字符
isprint——判断是否是可打印字符,包括图形字符和空白字符
这些函数都是收录在头文件<ctype.h>
中,所以我们在使用这些函数时,需要引用这个头文件。
这些函数的使用方法十分相似,使用的基本逻辑就是通过函数的返回值来判断是否为对应的字符:
- 符合条件返回非零值;
- 不符合条件返回0;
下面我们以其中一个函数为代表来说明这些字符分类函数的用法;
1.1 字符分类函数的用法
这里我们以islower
函数为例来说明这类函数的用法,老规矩,我们先打开MSDN来看看这个函数:
islower
函数的原型如下所示:
int islower(int c);
这些字符分类函数的原型和islower函数一样,都是一个返回类型为整型,参数为整型的库函数。之所以参数为整型,是因为这些函数是根据这些字符的ASCII码值来进行分类判断的,如小写字符的ASCII码值是在97-122,如果我们不使用islower,我们就可以如下进行编码:
代码语言:javascript复制int main()
{
char a = 0;
scanf("%c", &a);
if (a >= 97 && a <= 122)
printf("%c的ASCII码值为%d,是小写字母n", a, a);
else
printf("%c的ASCII码值为%d,不是小写字母n", a, a);
return 0;
}
如果我们使用islower函数,我们则可以写成:
代码语言:javascript复制int main()
{
char a = 0;
scanf("%c", &a);
if(islower(a))
printf("%c的ASCII码值为%d,是小写字母n", a, a);
else
printf("%c的ASCII码值为%d,不是小写字母n", a, a);
return 0;
}
下面我们来运行一下这个代码:
就如islower一样,其他的字符分类函数的用法如出一辙,大家只要在使用时别忘记头文件<ctype.h>
就行了。
二、字符转换函数
与字符分类函数相同,C语言为程序猿提供了两个用来进行字母大小写转换的函数——tolower
、toupper
。我们同样通过MSDN来认识一下这两个函数:
从这里的介绍可以看到,tolower与toupper这两个函数与前面的字符分类函数一致,都是一个返回类型为整型,参数类型为整型的库函数,它们的作用就是进行字符的大小写转换。下面我们就来看一下它们的用法;
2.1 字符转换函数的用法
我们通过ASCII码表可以知道,大写字母与其对应的小写字母的ASCII码值相差32,也就是说,如果我们不借用这个字符转换函数的话,我们可以通过字母 -32来达到转换大小写的目的,如下所示:
代码语言:javascript复制int main()
{
char a = 0;
scanf("%c", &a);
printf("转换前字符为%c,对应的ASCII码值为%dn", a, a);
if (a >= 'A' && a <= 'Z')
a = 32;
else if (a >= 'a' && a <= 'z')
a -= 32;
printf("转换后字符为%c,对应的ASCII码值为%dn", a, a);
return 0;
}
如果我们通过函数来进行转换,我们就可以编写:
代码语言:javascript复制int main()
{
char a = 0;
scanf("%c", &a);
int b = 0;//接收转换后的值
if (islower(a))
{
b = toupper(a);
}
else if (isupper)
{
b = tolower(a);
}
printf("转换前字符为%c,对应的ASCII码值为%dn", a, a);
printf("转换后字符为%c,对应的ASCII码值为%dn", b, b);
return 0;
}
根据MSDN的描述,此时转换后的值是字符a的一个副本,也就是说,字符转换函数并未改变a的值,下面我们就来测试一下:
从测试结果中我们可以得到以下信息:
- 字符转换函数不是直接对操作对象进行转换,而是额外生成了一个副本;
- 当操作对象不符合条件时,不会对其进行任何操作;
字符分类函数与字符转换函数都是比较简单的函数,相信大家现在都能理解并会使用这两个函数了,这里我还是要提醒大家一下几点:
- 别忘记引用对应的头文件
<stdlib.h>
和<ctype.h>
; - 字符转换函数的返回值别忘记使用变量来接收,否则会报错。
三、字符串函数
字符串我们已经介绍过多次了,它的定义是由双引号引起的一个或多个字符就叫做字符串。我们在前面的学习中,对字符串掌握了以下知识点:
'