字符分类函数
isdigit 十进制的判断
条件符合就为真,否者为假
#include<ctype.h>
// isdigit 十进制的判断
int main()
{
if (isdigit('9')) //注意这里给的是''单引号
printf("字符9是十进制的数字\n");
else
printf("字符9不是十进制的数字\n");
return 0;
}
isxdigit 十六进制判断
条件符合就为真,否者为假
#include<ctype.h>
int main()
{
if (isxdigit('A')) //注意这里给的是''单引号
printf("字符A是十六进制的数字\n");
else
printf("字符A不是十六进制的数字\n");
return 0;
}
isupper 大写判断
条件符合就为真,否者为假
#include<ctype.h>
//isupper 大写判断
int main()
{
if (isupper('f')) //注意这里给的是''单引号
printf("字符f是大写字母\n");
else
printf("字符f不是大写字母\n");
return 0;
}
islower 小写判断
条件符合就为真,否者为假
#include<ctype.h>
//islower 大写判断
int main()
{
if (islower('f')) //注意这里给的是''单引号
printf("字符f是小写字母\n");
else
printf("字符f不是小写字母\n");
return 0;
}
tolower 转小写
#include<ctype.h>
int main()
{
char a = 'D';
printf("%c\n", tolower(a));
return 0;
}
toupper 转大写
//toupper 小写转为大写
#include<ctype.h>
int main()
{
char a = 'd';
printf("%c\n", toupper(a));
return 0;
}
一些比较简单的式子,就不一一举例了,便就没有很详细的介绍,但也给大家做个一个汇总的表格,也是尽可能概括的这些字符函数的使用方法:
函数 | 如果条件符合就是条件为真 |
iscntrl | 检查字符是否控制字符(任何字符) |
isspace | 检查字符是否为空格,类型很多列:'\t'、‘\s’、‘\n’、‘0’ |
isdigit | 检查他是否是十进制‘0’~‘9’(字符数字需要加‘’) |
isxdigit | 检查字符是否为十六进制数字(包括十进制) ‘a~f’、'A~F'、‘0‘ ~ ’9‘ |
islower | 检查字符是否为小写字母 |
isupper | 检查字符是否为大写字母 |
isalpha | 检查字符是否为字母 |
isalnum | 检查字符是否为字母数字 |
ispunct | 检查字符是否为标点符号 |
isgraph | 检查字符是否具有图形表示(除空格外) |
isprint | 检查任何字符是否可打印(包含图形字符和空白字符) |
字符串函数
长度是不可控的字符串的函数
strlen 长度统计
strlen 是用于统计字符串长度的一个库函数,因为这个字符串有个重要特征:以‘\0’作为结束的标志。strlen正根据这个一个特点,从首元素开始,逐个地址对比统计,得出这个字符串的长度。如果没有找到结束标记,便会直接往后找,得到这个随机值。
注意事项:
- strlen 统计的是\0之前出现的字符
- 返回值是size_t(unsigned int 无符号整形(插入一个知识点:%zu是他的标准占位符,而%zd既能size_t打印无符号整数,也能打印有符号的整形的ssize_t,一般是用于他的标准占位符%zu)
- 记得要包含头文件的引用
- 学会strlen的模拟实现
strlen 模拟实现:
方法一: 计数器
方法二:指针-指针
方法三:不设定变量值实现模拟实现
strcpy 拷贝
字符串的拷贝需要俩个字符串,字符数组(目的地)与字符串(源)strcpy只有要俩个字符串,既把字符串(源)拷贝到字符数组(目的地)(切记这个结束标志\0也要拷贝过来!!!)确保字符数组dest是可改变,数组的空间一定要足够大,不然要可能导致越界访问了,到时候想找这个指针也成了野指针了!
结束标记\0别忘记拷贝
注意事项:
- 源字符串必须要包括\0
- 目标空间的字符数组一定要足够大,能装下源字符串
- 目标空间是必须是可以修改的
- 源字符的\0必须也要拷贝到目标空间里面(上面也有把图附上了,不懂可以再看看哈)
- 学会模拟实现strcpy
strcpy 模拟实现:
strcmp 比较
字符串比较函数是从首字符开始比较,通过字符的ASCll比较,如果str1>str2 返回1,相反str1<str2 返回-1 ,如果俩个字符相等,则就返回0.因为比较字符大小不需要改变值,便用const进行保护修饰。
注意事项:
- 字符串大小比较,与长度无关
- 从首字符开始,逐个对比比较
- 字符是通过ACSLL码做对比
- 学会实现模拟实现
模拟实现:
参插一个知识点:str1 < str2 可以到一个随机负数,当然str1 > str2 的话也是随机正整数。
strcat 追加
追加,就是在目标的字符数组末尾(\0)添加字符串(源)的值,比如目标字符串数组为abcd,源字符为1234,经过追加后成,字符数组为:abcd1234,值得一说的是strcat是不可以自己调用自己的哈,不然再追加过程,目标字符数组结束标志会被覆盖,导致字符串找不到结束标志形成一直循环成了随机值。
注意事项:
- 源字符串和目标字符串都必须要有\0
- 目标空间 一定要足够大
- 目标空白必须可以修改,所以是字符数组
- 学会实现模拟实现
strcat 模拟实现:
长度是可控的字符串的函数
strncpy 可控拷贝
相对的strcpy,strncpy多个字母n,n的含义是可以传递多少位字符数,相对前面固定的拷贝,相对严谨且灵活,而且选定的strncpy的n字符中没有包含\0,则可控拷贝结束后,strncpy会自动添加\0。
注意事项:
- 源字符串不一定要\0(函数假如没有会自己添加)
- 目标字符数组空间要足够大
- 目标空间必须要足够大
- 实现模拟实现
模拟实现:
strncmp 可控比较
同样这个和,上面所见的strcmp相似也就一一细说了,也是控制比较长度,当然目标空间不能超过源字符串,但需要注意的是他这个是n,n的含义是能够传递多少位字符数,也就是比较到第n位,当他str1还有字符时,而str2没字符时,都将补充'\0',进行和str1比较ascll的长度。
注意事项
- 控制比较字符数不能为负数
- 基本和strcmp 基本一致
- 学会实现模拟
模拟实现
strncat 可控追加
可控追加,旨在控制源字符串中字符追加的数,和strcat也是类似,就是多个n,n表示可传递多少的字符位,假设目标字符数组位 ABCD ,而源字符串为1234,当我们只传递2个字节数,追加结束,目标字符数组为ABCD12,但与strcat不同的是他无需添加结尾标识,因为strncat会自己添加结束标志\0.因此可以利用这一点自己可以给自己追加,完成自己所想要的需求哈。
注意事项:
- 目标字符数组还是必须有结束标志\0
- 目标空间要足够大
- 源字符串可以不包括\0(当结束移动追加数是自动会再末尾添加到\0
- 实现模拟实现
模拟实现
特殊字符串函数
strstr 寻找
字符串寻找函数,作用是在目标字符数组中寻找是否出现过源字符串,如果出现一次返回源字符串第一次的目标字符串第一次出现的位置地址,直到目标字符数组的结尾标志,如果没有出现记返回一个空指针。
注意事项
- 只要传入的字符串地址就行
- 实现模拟实现
模拟实现
strtok 分割
字符串分割函数,顾名思义就是把字符串进行分割操作,比如字符abcd&1234,我们便会把&视为分隔符,再把字符串地址和分隔符传给strtok函数,就能分成字符串abcd和字符串1234的首地址。但有个注意点:如果有字符串多个分隔符,再第一次分割时传入的首元素地址,第二次后续分割需要传递空指针,因为strtok具有记忆的功能,每次分割结束后,会记录下次的地址,为下次分割做好准备,因此传递空指针。如果分割多个字符串,只能传递首元素的地址,便会自己记忆保存
注意事项:
- 目标字符数组中要有结束结束标志
- 第一次传递的是首元素的地址
- 如果是同一个字符串,第二次传递需要一个空指针
- 在使用这个函数,最好创建有个临时变量存储目标数组的值(最好是可修改的那种),避免分割对目标字符串造成影响
streror 报错
这个特殊字符串函数需要配合错误码使用;错误码:是指向各种错误信息的数字代码,比如数字0表示没有错误。经有关博主曾测试,在erron头文件中寻找,至少大约有141错误码,如果直接错误码直接放入strerror中并打印,会出现相应的错误信息,当然c语言中有一个记录错误码,既便erron,并引出头文件erron.h,当程序报错的话就是,erron自动获取当前的错误码,这样一来,strerror(errno)搭配更好的打印出错误信息。
注意事项:
- strerror 中的参数必须是整数,字符型会按ascll码来处理
- 在使用错误码时,要记得添加头文件 errno.h
内存函数
内存操作函数比较高端,它们更像不可控字符串函数pro版,因为内存的操作对象是所有类型,而字符串函数只是面向字符串的设计
memcpy 拷贝
比较全方面的strcpy
注意事项:
- 目标空间足够大
- 目标空间也必须能修改
- 传入的元素数的单位是字节,别搞混
- 传入的字节数需要慎重考虑,这里最好也可以学上面那样的输入sizeof(强转类型)*元素数
- 学会模拟实现
模拟实现
memmove 移动(可重复拷贝)
内存移动函,移动可以看作拷贝,menmove包含memcpy的功能,能是实现更多的操作,可以比较成假如考试60分是及格的话,而能得60分便是memcpy的功能,但memmove却能得带100分成绩,而运行在Windows的2022vs mencpy却能实现memmove的功能,所以也成100的分的成绩
注意事项:
- 目标空间足够大
- 目标必须是可修改
-
和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠
- 这个函数遇到\0是不会自己停止的
- 学会模拟实现
模拟实现:
memcmp 比较
内存比较函数,其实就是strcmp的升级版,这个是适合所有类型,接收的时候会使用空指针进行接收,后面比较时再转化为字符型指针进行解引用比较,确保每位都能对比到,返回值必须和strcmp返回初始值
注意事项:
- 传递参数时,要传地址(指针)(数组名的首元素的地址)
- 返回的参数为整形,才能进行判断
- 传入字节数要慎重考虑
- 学会模拟实现
模拟实现:
memset 设置
内存设置函数,顾名思义就是对数据在内存中做修改,memset 可用于某些数据的初始化,当然内存设置这个函数适合所有类型的数据,这些函数实现起来比较简单,无非就是逐字节进行修改,类似memcpy吧,不过源字符串为传入的固定值。
注意事项:
- 参数1要为指针,如果不是指针类型,便要传入地址
- 参数2为整形,代表在内存中设置的具体值
- 参数3需要考虑,不能超过源数据的大小
讲到这个已经把内存函数、字符串函数、字符函数,感谢的兄弟们的观看,如果觉得帮助到你的话,期待你留下一个小小赞,如果觉得还需要少写什么的话,也可以评论补充下面,每一条我都会去看的,感谢大家 !!!