【c语言】字符函数和字符串函数(1)
一、字符分类函数
c语言中有部分函数是专门做字符分类的,也就是一个字符是属于什么类型的字符,这些函 数的使用要包含一个头文件ctype.h中。
其具体如下图所示:
这些函数的使用方式都类似,下面我们通过一个函数来看其使用方式:
islower函数是能够判断参数c是不是小写字母,如果参数c是小写字母那么就返回非0的整 数,如果不是小写字母就返回0。
下面我们通过一个练习来学习:
将字符串中小写的字母变成大写的字母。
思路:
首先我们创建一个字符串数组存放这个字符串,然后遍历这个字符串,判断其是否为大 写字母,如果不是则对其-32就可以变成大写字母了,然后我们将其打印出来看是否完 成。记得要包含这个函数的头文件<ctype.h>
运行结果:
二、字符转换函数
c语言中提供了两个字符转换函数,要使用这两个函数也是一样要包含头文件<ctype.h>
那么我们上面的练习可以换个方式写:
因为这两个函数的参数不是地址,那么其是值传递,那么其是不会改变实参的,不过其返回 的是变成大写后的字符,那么我们就通过一个第三者去接收其返回值,然后再赋值给这个字 符串。
运行结果:
三、strlen的模拟实现
我们先看一下这个函数的原型:
size_t strlen(const char * str);
strlen函数的原理:
字符串是以\0为结束的标志,strlen函数就是返回字符串中\0前面的字符个数(不包含\0)
那么参数指向的字符串必须要以\0结尾
注意函数的返回值为size_t类型,是无符号的类型。
还有函数的使用要包含头文件string.h
那么我们知道其计算字符串的长度的原理后我们来模拟实现这个函数吧。
函数参数就和原型一样。
函数实现:
因为我们传递给函数的是个地址,那么我们可以使用断言,先判断传入的数据是可以使用 的。我们可以在函数的开始就对str参数使用assert对其进行断言,注意使用其要包含头文件 assert.h。
然后我们创建一个指针变量来接收传入的参数的地址。
然后通过循环对字符串的字符遍历,直到遇到\0就停止遍历。
此时的指针变量和传入的参数的差值就是字符串的长度了。
函数实现:
上面为啥循环条件是对p进行解引用呢?那么因为字符串遍历中我们遇到\0就停止,然后我 们对其解引用刚刚好是0那么此时就可以停止循环了。
函数测试:
四、strcpy的使用和模拟实现
函数strcpy的作用的拷贝字符串,就是复制粘贴的功能,比如说我们现在要将数组arr2的字 符拷贝给数组arr1,那么我们就可以使用这个函数,使用其一样要记得包含头文件string.h, 下面我们看看函数的原型。
char *strcpy(char * destination , const char * source );
函数解析:
strcpy的第一个参数是我们要拷贝到的目的地的首地址,第二个参数是我们要拷贝的对象, 然后其返回值是接收这个拷贝的目标地址。
下面为strcpy函数的要求:
源字符串必须以"\0"结束
其会将源字符串的"\0"也拷贝至目标空间
目标空间必须要足够大,能够存放源字符串。
然后目标空间的内容要是可以修改的。
为了更好模拟实现strcpy函数,下面我们使用其看看其效果:
可以看到我们将str2字符串的内容拷贝到了str1。
下面我们来模拟实现其功能:
函数名:my_strcpy
参数:第一个字符指针接收目标空间的首地址,第二个接收要拷贝的字符串的首地址。
函数实现分析:
和前面的strlen函数实现一样,由于参数都是指针参数,我们可以在开始先使用断言,注意 使用断言要包含头文件assert.h。
然后因为要返回目标空间的初始地址,那么我们就创建一个指针变量存放目标空间的首地 址 ,在最后返回这个地址。
然后我们遍历要拷贝的字符串,对其解引用,然后赋值给目标空间的对应位置,没赋值一 次后对目标空间的字符串的地址和拷贝的字符串都进行+1操作,然后直到要拷贝的字符串 遇到\0,但是注意的是这个\0也要拷贝到目标空间,那么我们可以将循环的条件变成 *str1=*str2,那么此时当要被拷贝的字符串的\0赋值给目标空间后,循环也结束。
代码如下:
运行结果:
五、strcat函数的使用与模拟
strcat函数的功能是追加字符串,将一个字符串的内容追加到另一个字符串的末尾处,其使 用要包含头文件string.h。
下面我们看看strcat函数的原型:
strcat(char *str1,char*str2);
可以看到其参数和strcpy函数一样,也是两个字符指针,其就是将第二个参数追加至第一个 参数的字符串,且其返回值也是被追加的字符串的首地址。
下面是strcat函数一些要求:
源字符串必须要以\0结束
目标字符串也要有\0字符,因为追加是在\0的位置开始追加。
被追加的空间要足够大,能够容纳追加的源字符串的内容。
被追加的空间要能够给修改。
下面我们来模拟实现strcat函数:
和前面的一样,这里的函数的参数是两个指针变量,那么我们开始对其断言一下。
然后我们思考一下如何追加,我们是将第二个字符串追加到\0的后面么,很明显,我们是 在被追加的字符串的\0的位置开始追加。
那么我们追加前,先将被追加的字符串移动至\0的位置,然后开始追加。
由于要返回的是被追加的字符串的首地址,那么我们在开始的时候创建一个字符指针变量 存放被追加字符串的首地址。
代码实现:
运行结果:
六、strcmp的使用和模拟实现
strcmp是用来比较两个字符串大小的,其比较的依据是字符的acsll码值,其使用也要包含 头文件string.h。
下面我们看看其函数原型:
int strcmp(const char * str1 ,const char * str2);
可以看到其两个参数就是我们要比较的两个字符串的地址,然后其返回类型为整型,其就 是如果前一个字符串大于后一个字符串,那么其就返回一个大于0的数,反之就返回一个小 于0的数。
下面是strcmp函数的一些特点:
第一个字符串大于第二个字符串则返回大于0的数。
第二个字符串大于第一个字符串则返回小于0的数。
两个字符串如果相等则返回0。
其比较的对应位置上的字符的acsll码值。
下面我们使用其感受一下:
下面我们模拟实现strcmp函数:
函数实现分析:
和前面一样由于参数是两个指针,所以我们开始对其断言一下。
我们可以使用一个while循环,循环条件就是两个字符串对应位置的字符是否一样马,如 果一样那么就继续往后面的位置找,直到说其中一个字符串到了\0的位置,此时两个字符 串的大小就是相等的,此时返回0,最后返回的值就用第一个字符串的值和第二个字符串 的值做差,那么大于0的数就是第一个字符串大,反之。
函数实现:
运行结果:
感谢哥哥姐姐们的阅读,有不对的地方请指正!!!