当前位置: 首页 > news >正文

【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现

目录

 一.字符分类函数

1.1--字符分类函数的理解

1.2--字符分类函数的使用

 二.字符转换函数

2.1--字符转换函数的理解

2.2--字符转换函数的使用 

三.strlen的使用和模拟实现

3.1--strlen的使用演示

3.2--strlen的返回值

 3.3--strlen的模拟实现

 四.strcpy的使用和模拟实现

4.1--strcpy的使用演示

4.2--strcpy的模拟实现

五.strcat的使用和模拟实现

5.1--strcat的使用演示 

5.2--strcat的模拟实现 


🔥个人主页:@草莓熊Lotso的个人主页

🎬作者简介:C++研发方向学习者

📖个人专栏:《C语言》

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。 


 一.字符分类函数

1.1--字符分类函数的理解

--C语言中有一系列函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。

这些函数的使用都需要包含头文件ctype.h

1.2--字符分类函数的使用

这些函数的使用方法十分类似,在这里以一个函数为例,其它的都很类似:

1. int islower ( int c ); 

islower是用来判断参数部分的C是不是大小写的,通过返回值来说明是不是小写字母,如果是就返回非零整数,如果不是就返回0;

练习:

 写一个代码,将字符串中的小写字符全部转为大写,其它字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{int i = 0;char arr[] = "I am a GENIUS";while (arr[i]){if (islower(arr[i]))arr[i] -= 32;//小写字母和大写字母的Ascll码值差32printf("%c", arr[i]);i++;}return 0;
}

 二.字符转换函数

2.1--字符转换函数的理解

--C语言提供了2个字符转换函数:(也需要包含头文件ctype.h)

1. int tolower ( int c ); //将参数传进去的大写字母转小写

2. int toupper ( int c ); //将参数传进去的小写字母转大写

上面我们将小写转大写,是利用了小写字母和大写字母的Ascll码值差32的性质,有了转换函数,就可以直接使用toupper函数实现小写转大写了。

2.2--字符转换函数的使用 

练习:

 写一个代码,利用字符转换函数将字符串中的小写字符全部转为大写,其它字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{int i = 0;char arr[] = "I am a GENIUS";while (arr[i]){if (islower(arr[i]))arr[i]=toupper(arr[i]);printf("%c", arr[i]);i++;}return 0;
}

三.strlen的使用和模拟实现

1. size_t strlen ( const char  *  str );

功能:统计参数str指向的字符串的长度,统计的是字符串中 '\0' 之前的字符的个数。

参数:str指针,指向了要统计长度的字符串。

返回值:返回了str指向的字符串的长度,返回的长度不会是负数,所以返回类型是size_t。

3.1--strlen的使用演示

#include<stdio.h>
#include<string.h>int main()
{const char* str = "abcdef";printf("%zd\n", strlen(str));//6return 0;
}

使用注意事项:

  •  字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
  • '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为 size_t,是无符号的( 易错 )
  • strlen的使用需要包含头文件<string.h>

3.2--strlen的返回值

 --strlen函数的返回值为 size_t,是无符号的( 易错 ),那为什么说它易错呢,我们来通过一串代码直观了解一下吧

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if (strlen(str2) - strlen(str1) > 0){printf("str2>str1\n");}else{printf("srt2<str1\n");}return 0;
}

错误理解:按一般的想法来说,strlen(str2)-strlen(str1)应该是-3,小于0,所以打印srt2<str1,但是其实不是,我们来看看运行的结果: 

我们会发现结果是str2>str1,这正是因为strlen函数的返回类型是size_t类型,始终大于0,strlen(str2)-strlen(str1)的结果也是size_t类型的,所以也是大于0,直接打印出str2>str1。不过改成strlen(str2)>strlen(str1)就会打印出srt2<str1了。当然也有别的理解方法,这里就不多讲了。

 3.3--strlen的模拟实现

方法1:

//用计数器的方法
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{int count = 0;assert(str!=NULL);while (*str){count++;str++;}return count;
}
int main()
{char arr[] = "abcdef";size_t ret = mystrlen(arr);printf("%d", ret);return 0;
}

方法2:

//用指针减指针
#include<stdio.h>
#include<assert.h>
size_t mystrlen(char* str)
{assert(str != NULL);char* p = str;while (*p){p++;}return p - str;}
int main()
{char arr[] = "abcdef";size_t ret = mystrlen(arr);printf("%d", ret);return 0;
}

方法三:

//不创建临时变量,用递归做
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{assert(str != NULL);if (*str == '\0'){return 0;}else{return 1 + mystrlen(str + 1);}}
int main()
{char arr[] = "abcdef";size_t ret = mystrlen(arr);printf("%d", ret);return 0;
}

 四.strcpy的使用和模拟实现

1. char *  strcpy (char  *  destination, const char  *  source );

功能:字符串拷贝,将源头的字符串拷贝到目标空间中,拷贝到源头字符串中的 '\0' 为止。

参数: destination指针,指向目的地空间;source指针,指向源头数据。

返回值:strcpy函数返回的目标空间的起始地址。

4.1--strcpy的使用演示

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = { 0 };char arr2[] = "hello";char*p=strcpy(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);//两种打印方式都可以return 0;
}

 使用注意事项:

  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空。
  • 目标空间必须可修改,比如用char*p="xxxxxxxxxxxx"就不行,无法修改

4.2--strcpy的模拟实现

#include<stdio.h>
#include<assert.h>char* mystrcpy(char* arr1, const char* arr2)
{assert(arr1&&arr2);char* p = arr1;while ((*arr1++ = *arr2++)){;}return p;
}
int main()
{char arr1[20] = "xxxxxxxxxxxxxx";char arr2[] = "abcdef";char* ret = mystrcpy(arr1, arr2);printf("%s", ret);return 0;
}
//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分

五.strcat的使用和模拟实现

1.  char *  strcat (char  *  destination, const char  *  source );

功能:字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中。

参数:destination指针,指向目的地空间;source指针,指向源头数据。

返回值:strcat函数返回的目标空间的起始地址。

5.1--strcat的使用演示 

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello";char arr2[] = "world";char* p = strcat(arr1, arr2);printf("%s\n", p);printf("%s\n", arr1);//两种打印方式都可以return 0;
}

使用注意事项:

  • 源字符串必须以 '\0' 结束。
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空。
  • 目标空间必须可修改,比如用char*p="hello"就不行,无法修改

5.2--strcat的模拟实现 

#include<stdio.h>
#include<assert.h>char* mystrcat(char* arr1, const char* arr2)
{assert(arr1 && arr2);char* p = arr1;while (*arr1){arr1++;}//找到目标字符串中的\0,明确从那里开始追加。while ((*arr1++ = *arr2++)){;}return p;
}
int main()
{char arr1[20] = "hello";char arr2[] = "world";char* ret = mystrcat(arr1, arr2);printf("%s", ret);return 0;
}

往期回顾节选:

【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析

【趣味小游戏】--扫雷游戏

结语:本篇文章就到此结束了,继前面几篇文章后,在此篇文章中给大家分享了字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现等知识点,后续会继续分享字符函数和字符串函数的相关知识点,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

http://www.dtcms.com/a/195439.html

相关文章:

  • Vue 2.0学习
  • ch10 课堂参考代码
  • 什么是直播美颜SDK?美颜技术底层算法科普
  • MAX6749KA-T硬件看门狗调试
  • uv python 卸载
  • 深入理解 this 指向与作用域解析
  • 数据如何驱动互联网一体化发展?
  • GCC 版本与C++ 标准对应关系
  • **练习案例2:点和圆的关系**设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系。
  • 多态性标记设计
  • 深度学习驱动下的目标检测技术:原理、算法与应用创新
  • 敏捷-第一章 引言:瀑布与敏捷
  • 自建商城系统是选源码还是saas
  • WHAT - SSR vs SSG vs ISR
  • 【数据机构】2. 线性表之“链表”
  • Linux系统编程——exec族函数
  • 如何在 Windows 10 或 11 上使用命令提示符安装 PHP
  • React学习———React Router
  • 【AI基础设施安全检测工具】AI Infra Guard安装使用详细说明
  • 数学实验(Matlab编程基础)
  • 第十天——贪心算法——深度总结
  • firewall防火墙
  • Seata源码—4.全局事务拦截与开启事务处理二
  • CSR、SSR与ISR的奇妙之旅
  • 2水平3因子设计
  • AGI大模型(18):各大平台RAG实现之智普RAG
  • math.js 加/减/乘/除 使用
  • labelimg安装及使用指南(yolo)
  • 红黑树实现
  • 从一场亲历事故聊聊数据库操作日志+数据恢复