C语言—字符函数和字符串函数
1.字符分类函数
字符控制函数:int iscntrl ( int c );
控制字符通常不是可打印字符,该函数是用来判断参数是否为控制字符,需要的头文件为<ctype.h>
标准ASCII码中,不可打印字符主要包括以下两类:
控制字符:这些字符的ASCII编码值在0到31之间(包括0和31),以及127。常见的控制字符及其功能如下:
0 (NUL)-空字符,用于字符串的结束
1 (SOH)-文头,用于标识消息的开始
2 (STX)-文本开始
3 (ETX)-文本结束
4 (EOT)-文尾,表示数据结束
5 (ENQ)-询问,用于请求响应
6 (ACK)-确认,表示正确接收
7 (BEL)-响铃,用于发出声音警告
8 (BS)-退格,用于删除字符
9 (HT)-制表符,用于水平制表
10 (LF)-换行符,用于换行
12 (FF)-换页符,用于换页
13 (CR)-回车符,用于回车
31 (DEL)-删除字符,用于删除字符。
通信专用字符:这些字符也属于不可打印字符,用于特定的通信功能,例如SOH(文头)、EOT(文尾)等。
使用场景和功能
不可打印字符主要用于控制外围设备或显示器的行为。例如:
换行符?:\n(LF,ASCII值为10)用于在文本中创建新行。
回车符:\r?(CR,ASCII值为13)用于返回行首。
退格:\b?(BS,ASCII值为8)用于删除字符。
制表符:\t?(HT,ASCII值为9)用于水平制表。
响铃?:\a(BEL,ASCII值为7)用于发出声音警告。
例子:字符分类函数的使用方法类似
输出:
常见的字符分类函数
返回值:如果表达式为真返回非零值,否则返回0或EOF,表示为假。
2.字符转换函数
tolower和toupper
tolower函数是将大小字母转换为小写字母,函数的声明为:int tolower(int c);
toupper函数是将小写字母转换为大小字母,函数的声明为:int toipper(int c);
例子:将字符a转换为字符A,将字符X转换为x;
3. 字符串函数
所有字符串函数的使用对应的头文件是<string.h>或<cstring>
3.1 strlen函数
strlen函数是用来字符串\0前出现的字符个数,参数是字符串的起始地址,返回类型是无符号整型
strlen的模拟实现,使用递归的方式实现
3.2 strcpy函数
strcpy函数是将源头字符串拷贝到目标字符串中,第一个参数是目标字符串的起始地址,第二个参数是源头字符串的起始地址,返回的参数是char*类型,返回的是目标字符串的起始地址。
通过按F10启动调试观察ch1和ch2数组拷贝前的元素
调用strcpy函数后,ch2数组的内容拷贝到ch1数组上
strcpy的模拟实现
例子
启动调试观察到arr2字符串的\0也拷贝到目标字符串中
3.3 strcat函数
strcat函数的功能是在目标字符串后追加一个字符串,第一个参数是目标字符串的起始地址,第二个参数是追加字符串的地址,返回值是目标字符串的起始地址。
strcat的模拟实现
例子
启动调试观察窗口
3.4 strcmp函数
strcmp函数是用来比较两个字符串的大小关系,通过一对对字节来比较,直到\0为止;两个参数是需要比较的两个字符串的起始地址,返回值为int,如果str1>str2,返回大于0的数,如果str1 ==str2,返回0,如果str1 < str2,返回小于0的数。
按F10启动调试,第一次输入123456,input数组输入替换为123456
第二次输出666666,input数组被替换的部分为66666
第三次输入888888 ,与密码匹配,strcmp返回0,正确输出
strcmp的模拟实现
例子
3.5 strnncpy函数
与strcpy类似,功能是将源头字符串拷贝到目标字符串中,但是与strcpy区别的是strncpy有第三个参数,单位是字节,可以指定拷贝的字符个数。
按F10启动调试观察,strncpy调用后,将指定字节的数据拷贝,但是在末尾没有补\0
strncpy模拟实现:strncpy的源头字符串长度没有拷贝字符串长度长时,将剩下需要拷贝数组补\0
例子
3.6 strncat函数
strncat是指定字节个数将源头字符串的数组追加到目标字符串后,第一个参数是目标字符串的起始地址,第二个参数是源头字符串起始地址,第三个参数是需要拷贝的字节个数,返回值是目标字符串的起始地址。
按F10启动调试,可以观察到调用strncat函数后,原本p1数组为\0的位置被替换,p2数组不足5个字节,在拷贝p2数组\0前的数据后在p1数组后补一个\0后不再拷贝数据。
strncat的模拟实现
法一:使用for循环
法二:使用while循环
3.7 strstr函数的使用
strstr是在主串中寻找是否存在子串,如果找到返回在主串中第一次出现的起始位置,如果没有找到返回空指针NULL,strstr函数的声明需要两个参数,第一个参数的主串的起始位置的指针,第二个位置是子串的起始位置指针,返回值:如果找到返回在主串中第一次出现的起始位置,如果没有找到返回空指针NULL。
a主串中包含b子串,返回值pr接收主串第一次出现子串的位置,指向字符 'a' 的位置。
strstr的模拟实现,因为strstr的实现方式有比较多的方式,此处模拟实现的是最简单的一种,高效的实现方式有BF算法和KPM算法,此处不做具体接受,推荐链接:主要实现NEXT数组和VALUE数组,实现 i(主串下标)不退,j(字串下标)根据Next数组回退。
【完整版】终于有人讲清楚了KMP算法,Java语言C语言实现_哔哩哔哩_bilibili
s1是指向主串的指针,s2是指向子串的指针,p是记录主串的位置;第一次解引用s1 和 s2不匹配,p就指向第二个字符的位置,重新将p的值赋给s1,子串的起始位置重新赋给s2。
一直循环s1 和 s2 的解引用的解引用操作,直到子串遇到\0匹配成功或者匹配失败终止。
3.8 strtok函数的使用
strtok函数是将指定字符串中的分隔符替换为\0,第一个参数是字符串起始位置,第二参数是分隔符的地址,第一次调用,如果字符串有指定分隔符,返回字符串起始位置的地址,再次调用时,第一个参数为NULL,如果字符串中找到指定分割符,将分隔符替换为\0,返回上一次替换分隔符位置的下一位置,如果调用时查找的字符串没有指定分隔符,返回空指针。
在上图字符串中,abc后有一个指定分隔符 ‘ . ’ ,第一次调用strtok将‘ . ' 替换为\0,返回指向a的地址,第二次调用strtok时,将f后的' .' 替换为\0返回指向e的地址,第三次调用strtok函数,将s后的 ' . '替换为\0,返回指向s的地址,第四次调用没有分割符,传回上一个分隔符的下一位置,第五次时是访问的空间不属于字符串,返回NULL。
strtok的模拟实现
3.9 strerror函数
strerror函数通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误。
strerror函数中的参数经常会使用errno,errno是一个全局变量,用来存放错误码,当程序错误是,会将错误信息存放于这个错误码中,使用这一个错误码需要包含其头文件<errno.h>.
以上是常见的字符相关的函数,更多的字符函数可以打开c语言库函数进一步了解:
<cstring> (string.h) - C++ Reference