在c语言的使用当中,我们常常需要对一些字符和字符串进行操作,为了方便使用,c语言标准库里提供了一系列函数,让我们来学习一下这些函数
1.字符分类函数
顾名思义,字符分类函数就是对字符进行分类的函数,为了使用这些函数,我们需要包含一个头文件,ctype.h.,下图是对这些函数进行的介绍
这些函数的使用方法都是非常类似的,所以我们只介绍其中一个
islower:该函数用来判断字符是否为小写字母,是的话返回非0的数,不是则返回0
练习:将字符串中小写字母转为大写,其他字符不变
这里来给大家一个练习,下面为解法
2.字符转换函数
c语言标准库中提供了两个字符转换函数,tolower函数和toupper函数,两者分别用来将大写字符转化为小写字符,将小写字符转化为大写字符
有了这两个函数,上述的练习就可以直接使用。
3.strlen函数
该函数需要包含string.h这个头文件
size_t strlen(const char *a)
功能:用来计算a指向的字符串'\0'之前字符的个数
返回值:返回的是字符串的长度,不会是负数,所以函数的返回类型是size_t.
3.1代码演示
下面来演示一下该函数的使用
注意事项:1.该函数统计的是字符串里'\0'之前字符的个数,不包括'\0'
2.传给函数的指针指向的字符串必须包含'\0'
3.函数的返回值类型为size_t(无符号整数)
3.2函数的模拟实现
这里提供3种方法
3.2.1计数器
这里通过定义一个计数器来计算字符串的长度
3.2.2递归
递归是一种算法思想,通过将一个大的目标细化为一个个小的任务
可以看到,在my_strlen函数中,先对指针a指向的数据进行判断,如果是'\0',说明a已经遍历完这个字符串了,直接返回0就可以,如果不是'\0',说明字符串中还有元素没有计算,返回1和a的下一个指针的函数值。
这样可以不用创建临时变量,一层套一层,同样也能达到同样的效果
3.2.3指针
这个方法是通过指针来实现的,这里补充一些指针的知识
我们都知道指针+数字可以得到另一个指针,指针-数字也可以得到另一个指针,那么指针是否也可以进行+-运算呢,答案是可以进行-运算,不能进行+运算,指针+指针是没有任何意义的,而指针-指针则可以得到一个数字,这个数字的含义是,第一个指针和第二个指针中间相差的指针的个数
tips:地址在内存中是从低到高进行储存的
接下来来通过指针的方法进行计算
这种方法也是可行的
4.strcpy函数
功能:这个函数用来将source指向的字符串拷贝到destination指向的字符串
参数:destination:指向目标字符串,source:指向源字符串
返回值:直接返回目标空间的起始地址
4.1代码演示
这里来演示一下strcpy函数的使用
注意事项:1.该函数会将源字符串中的字符包括'\0'一起复制到目标字符串中
2.源字符串必须要有'\0'结尾
3.目标空间必须足够大,以保证可以存得下源字符串
4.目标空间必须可修改
这里补充下一个知识,为什么一定要强调目标空间必须可修改呢,那么有没有目标空间不能修改的情况?有的,c语言中提供了一个关键字const
4.2 const
const是用来修饰变量的,使用方法是直接在变量的创建前加上const
const在修饰指针变量时要更特殊些
4.2.1const修饰指针变量
这里可以分为两种情况
第一种写法:const int * pa;
这种写法的意思是你不能通过pa进行解引用从而更改pa指向的对象的值
第二种写法: int* const pa;
这种写法的意思是,你不能修改pa这个指针中的地址,但可以通过这个指针修改pa指向的变量的值
4.3模拟实现
接下来,我们来模拟实现一下这个函数
tips:这里的assert断言需要包含头文件assert.h
5.strcat函数![]()
接下来来介绍strcat函数
功能:将src字符串的内容拷贝到des字符串的后面
参数和返回值与strcpy函数一下,这里不啰嗦了.
5.1代码演示
这里定义a,b数组时不能像前面一样不指定数组大小,这样会导致后面出现栈溢出的问题
5.2模拟实现
创建临时变量now的意义是储存des指向字符串的首地址
6.strcmp函数
功能:用来比较两个字符串的大小,从第一个字符开始比较,如果str1>str2,返回大于0的数,如果str1<str2,返回小于0的数,如果两个字符串相等,就返回0
参数;两个用来比较的字符串
6.1代码演示
6.2模拟实现
7.strncpy函数
这个函数与strcpy是类似的,只不过strncpy多了一个参数,这个参数是用来指定拷贝个数的
7.1代码演示
这个函数只拷贝了2个字符,也就是ef到a字符串中,覆盖掉了ab
7.2对比strcpy
这个函数与strcpy不同的点除了可以指定拷贝元素的个数外,它并不要求源字符串中有'\0',同时使用的时候也需要考虑到目标空间是否足够
8.strncat函数
这个函数与strcat函数是类似的,只不过它同样多了可以指定元素的功能,它能够指定你要追加的元素个数
8.1代码演示
这里指定的参数是2,所以就只拷贝了ed到a字符串的后面
8.2对比strcat
除了可以指定参数外,strncat并不要求源字符串中有'\0'
9.strncmp函数
同样与strcmp函数相似,这个函数可以指定要比较的字符个数
9.1代码演示
由于只比较了前三个字符,所以返回的是0
9.2对比strcmp
可以指定比较的长度,更加灵活,安全
10.strstr函数
功能:这个函数是用来在第一个字符串中查找第二个字符串的
返回值:如果找到了,就返回第一次出现第二个字符串的地址,如果没找到,则返回空指针
10.1代码演示
10.2模拟实现
这里运用多个指针来进行该函数的模拟实现。
首先创建s1,s2指针表示当前查找到的位置
再创建一个cp指针来表示可能查找到第二个字符串的位置
11.strtok函数
char*strtok(char* str,const char*delim);
功能:将第一个字符串按照提供的分隔符delim分成一个个子字符串,同时也会直接修改第一个字符串,会插入'\0'来替换分割符的位置
参数:str:要分割的字符串(首次调用传入字符串,后续调用传入指针,表示继续切割同一个字符串),delim:分隔符.
返回值:成功时返回指向当前子字符串的指针,如果没有子字符串了,就返回NULL
11.1代码演示
11.2注意事项
1.多个连续的分割符会被视为一个分格符,不会返回空字符串
2.在传入NULL之前,必须调用一次函数
12.strerror函数
char*strerror(interrnum );
功能:根据传递过来的整数返回相应的错误码
返回值:错误码字符串的地址
12.1代码演示
13.perror函数
perror相当于printf函数和strerror函数相结合
以上就是本篇文章的全部内容了,如果对你有帮助,可以点个赞支持一下,感谢各位的观看
陌染青云 (mo-ran-qingyun) - Gitee.com
这是我个人的gitee仓库,账号上文章的代码都会发到仓库里,有兴趣可以看一下