文章目录
前言
在编程的过程中,我们经常需要处理很多字符和字符串。库函数里提供了许多处理字符的函数,今天,我们来学习一下。
1.字符分类函数
C语言有一系列函数专门来实现字符分类,判断一个字符是什么类型的。其中使用这类函数时需要引用头文件ctype.h。
函数 | 参数满足下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f',换行’\n‘,回车’\r‘,制表符’\t‘,垂直制表符’\v‘ |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字符a~z |
isalpha | 字母a~z或a~z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
这些函数使用方法相近, 我们演示一个案例:
#include <stdio.h>
#include <ctype.h>
int main()
{
char ch = 'c';
if (islower(ch))
{
printf("是小写字母\n");
}
else
{
printf("不是小写字母\n");
}
return 0;
}
islower ?是能够判断参数部分的 ch 是否是⼩写字⺟的。通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回0。
2.字符转换函数
C语言提供了2个字符转换的函数,可以拿来直接使用:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
可以通过一个案例体会一下:
3. strlen的使⽤和模拟实现
size_t strlen ( const char * str );
- 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。 - 参数指向的字符串必须要以’\0'结束。
- strlen使用时需要包含头文件string.h
- 注意函数返回值时size_t,是无符号的。
下列代码可尝试运行:
因为返回值的类型是size_t(无符号的),所以相减得到的还是无符号的数。
以下是模拟实现strlen函数,可供参考:
方法1:
方法2:
方法3:
4.strcpy的使⽤和模拟实现
char* strcpy(char * destination, const char * source );
- 将源字符串内容拷贝至目标字符串中,包含最后的\0(用于终止字符)
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷⻉到⽬标空间。
- ⽬标空间必须⾜够⼤并且可以修改,以确保能存放源字符串。
模拟实现strcpy函数:
5. strcat的使用和模拟实现
- 追加源字符串到目标字符串后面。目标字符串中的空字符被源字符串的第一个字符覆盖,并且在目标字符串中由两者串联形成的新字符串的末尾包含一个空字符。
- 源字符串必须以 '\0' 结束。
- ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
- ⽬标空间必须有⾜够的⼤并且可以修改,能容纳下源字符串的内容。
模拟实现strcat函数:
6. strcmp的使用和模拟实现
- 这个函数开始从两个字符串的第一个字符开始比较。如果它们俩相同就继续比较下一个字符,直到某个位置的字符有存在大小关系或者某个字符到了空字符,此时停止比较。
- 标准规定:
- 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
- ◦第⼀个字符串等于第⼆个字符串,则返回0
- ◦第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
- ◦那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。
模拟实现strcmp函数:
7. strncpy函数的使用
char * strncpy ( char * destination, const char * source, size_t num );
- 将源字符串num个字符拷贝到目标字符串中。
- 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个
使用案例:
8.strncat函数的使用
char * strncat ( char * destination, const char * source, size_t num );
- 将源字符串的前num个字符追加到目标字符串末尾,再追加⼀个 \0 字符。
- 如果源字符串的⻓度⼩于num的时候,只会将字符串中到\0 的内容追加到目标字符串的末尾。
使用案例:
9. strncmp函数的使用
int strncmp ( const char * str1, const char * str2, size_t num );
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
这三个字符串受限函数,主要是加上了操作次数的限制,大体内容与之前的字符串函数相同,可尝试模拟实现。
10.strstr的使用和模拟实现
char * strstr ( const char * str1, const char * str2);
- 该函数返回字符串str2在字符串str1中第一次出现的位置。
- 字符串比较匹配不包含\0字符,以\0作为结束标志。
使用案例:
模拟实现strstr函数,其中最难寻找的案例是:
若按正常一个个比较寻找,arr1中出现bbb,arr2的bb可以相匹配,但是arr2中bbc的c
与arr1中bbb的最后一个b不匹配,所以我们要引入一个*p保存第一次相等的位置,继续比较是否相等。
11.strerror函数的使用
char * strerror ( int errnum );
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
在VS2022环境下输出的结果如下:
总结
以上就是今天要讲的内容,本文详细介绍了各类字符函数和字符串函数,还有strtok函数没讲到(自己尝试了解使用)。当你需要使用某函数时,可以自行去cplusplus网站搜索该函数,分析其参数内容并理解其作用,甚至模拟实现该函数。这是以后编写代码中需要掌握的一项技能。
创作不易,如果你喜欢这篇文章的话,请你不要吝啬你的三连哦!!!