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

【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.xdnf.cn/news/6628.html

相关文章:

  • AI数字人+展厅,定义未来展示空间的新模式
  • 如何选择PCB快速打样生产厂家?
  • UWB定位方案在水力发电站人员安全的应用推荐
  • C语言实现简单的—栈
  • 【漫话机器学习系列】261.工具变量(Instrumental Variables)
  • 从验证码绕过到信息轰炸:全面剖析安全隐患与防范策略
  • 网络流量分析 | NetworkMiner
  • activeMq 限制用户接收topic范围
  • Vue2项目中使用videojs播放mp4视频
  • EWOMAIL
  • Go语言实现生产者-消费者问题的多种方法
  • 【C++重载操作符与转换】句柄类与继承
  • 自定义CString类与MFC CString类接口对比
  • eSwitch manager 简介
  • InfluxDB 2.7 连续查询实战指南:Task 替代方案详解
  • python中元组的操作
  • 后端框架(2):Java的反射机制
  • 高效便捷的文字识别方案与解析
  • MATLAB中的概率分布生成:从理论到实践
  • 记录一次服务器卡顿
  • Redisson分布式锁-锁的可重入、可重试、WatchDog超时续约、multLock联锁(一文全讲透,超详细!!!)
  • SD框架下 LoRA 训练教程3-LORA学习率调度器(Learning Rate Scheduler)核心策略与实践指南
  • C++_STL_map与set
  • Java【13_1】final、初始化块、继承(测试题)
  • 每日Prompt:迷你 3D 建筑
  • pcie phy-电气层-gen1/2(TX)
  • C++ 条件变量与线程通知机制:std::condition_variable
  • PD 分离推理的加速大招,百度智能云网络基础设施和通信组件的优化实践
  • 【data】上海膜拜数据
  • AWS云入门宝典