C语言中专门封装了一个库函数用来判断某个字符是什么类型的字符用
这些函数要包括头文件
函数 如果参数符合下列条件就返回真
iscntrl() 任何控制字符
isspace() 空白字符,如空格、换页\f、换行、回车\r、制表符\t \v
isdigit() 十进制数字字符
isxdigit() 十六进制数字字符,包括数字字符和小写字母a~f和大写字母A~F
islower() 任何小写字母
isupper() 任何大写字母
isalpha() 任何字母
isalnum() 任何字母或数字
ispunct() 标点符号,任何不属于字母或数字的图形字符(可打印)
isgraph() 任何图形字符
isprint() 任何可打印字符,包括图形字符和空白字符(0~31的字符不可打印)
下面我们来尝试使用一下
C语言提供两个字符转换函数:
int tolower(int c); 将传进去的字符转成小写字母,但并不会改变原字符地址中的内容
int toupper(int c); 将转进去的字符成大写字母,但并不会改变原字符地址中的内容
下面尝试一下这个函数
这段代码中我将小写字母转成大写,将大写字母转成小写
其实 tolower() 和 toupper() 内置了判断语句,如果不是小写或大写字母就不会改变字符
size_t strlen ( const char * str );
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' ),参数指向的字符串必须要以 '\0' 结束,strlen的使⽤需要包含头⽂件
官网资料:https://cplusplus.com/reference/cstring/strlen/
要注意strlen返回值是size_t类型
这段代码之所以返回大于是因为两个无符号数相减,其结果也会是无符号数,所以在编写过程中要注意函数返回值的类型。
模拟实现strlen函数
如何不创建临时变量实现这个函数
运用递归将字符串拆开,回归一次加1,直到看见\0递推结束返回0
char * strcpy ( char * destination, const char * source );
将源头字符串(必须包括\0)拷贝到目的地字符串中去,返回目的地字符串的首字符地址
官网资料:https://cplusplus.com/reference/cstring/strcpy/
模拟实现strcyp
while中的那段语句看起来很奇怪是吗,我们拆开观察一下,我用p来作为一个指针变量, *p++ 首先运算结合性更高的p++,先使用,得到*p得到指针指向的变量内容,再++,指针变量自增,为下一次解引用做准备。之后依次把源头数组的内容赋值目的地数组的对应位置,当赋值完\0之后赋值表达式返回0(假),退出循环
char* strcat(char* destination, const char* source);
将源头字符串(必须包括\0)的内容追加到目标字符串。目标字符串中的 '\0' 会被源字符串中的第一个字符覆盖,返回目标字符串的首字符地址
官网资料:https://cplusplus.com/reference/cstring/strcat/
值得注意的是目标字符串一定要可以囊括下追加完后的字符串长度
模拟实现strcat
通过观察strcat的逻辑可以看出不能让字符串自己给自己追加,否则会访问冲突,因为自己的首字符内容已经被设置成不可修改的const了,但是strcmp函数还在尝试更改
int strcmp ( const char * str1, const char * str2 );
按对应位是上的字符大小比较,出现较小字符的一方字符串小于另一方,反之大于另一方,1号字符串小于2号字符串返回>0的整形,反之返回<0的整形,若两字符串相等返回0
官网资料:https://cplusplus.com/reference/cstring/strcmp/
模拟实现strcmp
刚才讲到的 strcpy strcat strcmp 都是很暴力的向后找\0 ,这种操作方法是很危险的,C语言又提供个3个带 n 的函数来替代他们,这种带n的函数是可以指定操作长度的
char * strncpy ( char * destination, const char * source, size_t num );
参数中的无符号整形变量num就是用来限制操作长度的,num是几就确定拷过去几个字符(可能不会将\0拷过去)也不会自动补\0,若num超过源字符串的长度,超出部分都补\0
官网资料:https://cplusplus.com/reference/cstring/strncpy/
这段代码就是因为拷过去的字符较少并没有包括\0所以还有一些x打印出来了
char * strncat ( char * destination, const char * source, size_t num );
strncart会自动在追加过后补上\0,如果若num超过源字符串的长度,超出部分也不会多补\0,于strcmp不同,strncat的num超出部分只会补一个\0
官网资料:https://cplusplus.com/reference/cstring/strncat/
这段代码就没有将多余的x打印出来,证明了在追加过后会补\0
int strncmp ( const char * str1, const char * str2, size_t num );
strncmp只会比较前num给字符元素给出答案
官网资料:https://cplusplus.com/reference/cstring/strncmp/
通过观察两个str可以看出strncmp函数中num的作用,看4个字符的时候arr1小,看3个字符的时候二者相等
const char * strstr ( const char * str1, const char * str2 );
在str1中寻找str2字符串,如果有找到则返回str2在str1中第一次出现的位置,如果找不到返回空指针
官网资料:https://cplusplus.com/reference/cstring/strstr/
可以看出来ret确实指向了第一次出现def的位置了
模拟实现 strstr
这是一种暴力求解的办法,事实上用KMP算法解决此类问题效率更高
char * strtok ( char * str, const char * delimiters );
strtok函数是用来拿到一个长字符串中被分隔符分开的每一份小字符串
delimiters参数指向一个字符串,其中元素是一些用作当分隔符的字符,比如邮箱中的"@."
str参数指向一个字符串,这个字符串是由0个或多个delimiters中的元素分割开的
strtok函数的作用是找到str字符串中的下一个分隔符,然后将分隔符改成\0,同时记住这个位置便于下一次进入str字符串,并返回进入本次str字符串的地址
当strtok函数的第一个参数str不为NULL时,从str的位置进入,寻找下一个分隔符,修改这个分隔符为\0,并保存\0的位置
当strtok函数的第一个参数str为NULL时,会从上次保存的位置开始,找下一个\0,并重复修改和保存的动作
当字符串剩余中没有分隔符了,就返回NULL
官网资料:https://cplusplus.com/reference/cstring/strtok/
char * strerror ( int errnum );
strerror函数可以将参数部分的错误码对应的错误信息的字符串地址返回来(把错误码翻译成错误信息)
官网资料:https://cplusplus.com/reference/cstring/strerror/
错误码是什么:
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会生成对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
C语言是可以操作文件的:打开文件用fopen函数,其返回类型是 FILE* 型变量
FILE* pf=fopen(···)
如果文件打开成功返回一个地址,如果文件打开失败返回NULL并在errno中存上错误码2
这里我要介绍一个新的打印函数perror,perror会自动在内容后面加上冒号空格和错误信息,可以理解成perror函数封装了strerror(errno) ,通过它的内涵我们可以看出它只是用来打印错误码含义用的,我们尝试用这个函数代替printf函数