字符函数与字符串函数以及它们的模拟实现

一:字符函数

1.字符分类函数

2.字符转换函数

二:字符串函数

1.strlen

2.strcpy

3.strcat

4.strcmp

一:字符串函数

1.字符分类函数:C语言中有一系列的专门做字符分类的函数,也就是判断自读属于什么类型的字符,它们均要包含在特定的头文件中<ctype.h>

1-1 iscntrl:判断所给的参数是否符合所给条件(对于任何的控制字符),如果符合,则是返回真。

1-2 isspace:判断是否有空白字符:'\n','\f',' '(空格) ,'f'(换页),'\r'(回车)

1-3 isdigit : 判断是否为十进制数字字符 '0'~'9'

1-4 isxdigit : 判断是否为十六进制数字字符 '0'~'9','a'~'f','A'~'F'

1-5 islower:判断是否为小写字母

1-6 isupper :判断是否为大写字母

1-7 isalpha : 判断是否为字母

1-8 isalnum : 判断是否为字母或数字

其可以用与判断大小写

2.字符转换函数

2-1 tolower ()--转化为小写

2-2 toupper()--转化为大写

二:字符串函数

3-1 strlen:要注意的是,其返回值为无符号整型size-t类型,由于无符号整型中在内存的存储中的第一个数字0或1并不为符号位,32位全为有效位,所以无符号整型一定是大于0的,并且无符号整型(-1)很大。

此处中给了一个例子,明明-3是小于0的,但是由于strlen函数返回的类型是无符号整型,所以-3被默认为是大于0的。

3-1-1strlen()函数的模拟实现

观察一下,目标是要计算出字符串个数,那么就可以利用循环遍历,而且遍历结束的标志为'\0',明确了我这一点,就可以写下属于我们自己的strlen函数了

3-2 strcpy:其为拷贝函数,表达式为strcpy(char* destnation,char* source),就是把source上的内容复制黏贴到目的地上,举一个小例子

此处需要注意的是,strcpy函数中只拷贝含有‘\0’的字符串,对于形如char arr[10]={'a','b'}的,不包含'\0'的,若利用strcpy,就会复制出一些不知道的字符,因为,strcpy拷贝停下来时依据'\0'的。

3-2-1模拟实现strcpy

此中要实现模拟,就要明白strcpy是把字符串的内容一个个拷贝到另一个地方,就利用遍历,结束依据依然为'\0'

3-3 strcat(): 追加,即在一个目标字符串的后面追加一个字符串,

形式为 strcat(char* destination,char*source),举一个例子来说明其运用

3-3-1 strcat()函数的模拟实现

首先还是要了解一下其是如何运作的,由于其为在目的地末尾添加,所以要先找到目的地的'\0',再来进行遍历,一个个的把内容赋值上去

3-4 strcmp :字符串的比较,注意,其比较的为字符串对应字符的ascill码值大小,而不是字符串的长度,举一个例子

此中返回的是-1,表示的是arr1小于arr2,因为在第二个字符的比较处,b的ascill码值是小于d的ascill码值,所以其会返回-1。

3-4-1strcmp的模拟实现

还是先要了解其实如何工作的,因为其返回的类型是整型,就是0,1,-1,因此在实现时也要分为三类讨论,而判断大小时,一般会先遇到相同的,但是要找不同,所以要先过掉相同的,直到找到了不同的就可以跳出循环来比较这两者的值,此时就可以利用判断语句,如果一直处在循环语句中,直到都遇到了'\0',则表示二者相同。

3-5 strstr ,其形式为 char* strstr(const char*str1,const char* str2),其功能是,若能在str1中找到属于str2的那一部分,也就是str2隶属于str1中的一部分时,其会找到那个第一次出现重复数字的字母,然后往下打印,如果在str1中找不到str2,那么就会返回空指针。

举一个例子:

3-5-1 模拟实现strstr

下面来进行一下详细的分析:

所以,对应的代码是:

而对于上面的函数,还有改进版,就是确定了要传输的字符串长度

char* strncpy(char* destination, char* source,size_t num) 此处多了一个传输大小的限制,且单位时字节,同理,其他也是如此

char* strncat(char* destination,char* source,size_t num)

char* strncmp(char* s1,char* s2)

3-6 memcpy 起作用也为拷贝,同样是放在string.h这个头文件中,其与之前的不同点在于其没有限制类型,同时也可以确定传输的多少,举一个例子:

3-6-1 memcpy的模拟实现

由于其也为拷贝,但是不同的是其有给所要用的内存的大小,因此,此中的传输较之前不一样的点在于其实以一个字节一个字节为单位来传输的

3-7 memmove(由于前面的memcpy无法完成空间重叠情况下的替换),就引入了memmove

其形式为void* memmove(void* dest,void*res,size_t num)

举一个例子:

3-7-1模拟实现memmove

分析:

代码实现:

今天的内容就先分享到这里啦,后续还有更多详细介绍到的C语言知识等着大家来获取。

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和煦的糖果

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值