脆皮之“字符函数与字符串函数”宝典

hello,大家好呀,感觉我之前有偷偷摸鱼了,今天又开始学习啦。加油!!!
在这里插入图片描述

文章目录

  • 1. 字符分类函数
  • 2. 字符转换函数
  • 3. strlen的使用和模拟实现
    • 3.1 strlen 的使用
    • 3.1 strlen 的模拟
      • 1.计算器方法
      • 2.指针-指针的方法
      • 3.递归的方法
  • 4. strcpy的使用和模拟实现
  • 5. strcat的使用和模拟实现
  • 6. strcmp的使用和模拟实现
  • 7. strncpy函数的使用
  • 8. strncat函数的使用
  • 9. strncmp函数的使用
  • 10. strstr的使用和模拟实现
  • 11. strtok函数的使用
  • 12. strerror函数的使用

1. 字符分类函数

C语言中有一系列的函数是专门做字符分类的,且这些函数在使用时都需要包含头文件:ctype.h

在这里插入图片描述

这些函数的使用大同小异,我举其中的一个例子:

从上图可以看出,函数islower是用来判断是否为小写字母,我们可以在cplusplus搜索islower函数,它给出的是:如果是小写字母,则返回非0值;如果不是小写字母,则返回0.

int main()
{int c = islower('A');int q = islower('a');printf("c=%d\n", c);printf("q=%d\n", q);return 0;//打印结果是:c=0;q=2
}

练习写一个代码:将字符串中的小写字母转大写,其他字符不变。(在学习字符转换函数之后有另外一种方式,大家可以尝试一下)

#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = "I am very sad." ;int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = arr[i] - 32;}i++;}//再将字符串输出,看是否变成大写printf("%s\n", arr);return 0;
}

2. 字符转换函数

C语言提供了2个字符转换函数:
int tolower ( int c ); ------- 转成小写--------- //将参数传进去的大写字母转小写
int toupper ( int c );------- 转成大写----------//将参数传进去的小写字母转大写
int c的意思是传入一个字符(字符的本质就是ascll码值),int tolower的意思是返回值为整数

int main()
{char ch = tolower('A');printf("%c\n", ch);char hh = toupper('a');printf("%c\n", hh);
}

之前小写转大写可以将if语句里面改掉

int main()
{char arr[] = "I am very sad." ;int i = 0;while (arr[i] != '\0'){if (islower(arr[i])){arr[i] = toupper(arr[i]);}i++;}//再将字符串输出,看是否变成大写printf("%s\n", arr);return 0;
}

3. strlen的使用和模拟实现

3.1 strlen 的使用

1.使用strlen需要包含头文件:string.h
2.字符串以’\0’ 作为结束标志。

  • 比如:“abc” 其实就是‘a’ ‘b’ ‘c’ ‘\0’,一共4个字符。但是strlen只统计’\0‘之前的字符个数。(不包含’\0’)
  • 如果字符数组中是char arr[]={‘a’,‘b’,‘c’};的话,则是没有\0的,什么时候遇到\0不确定。
int main()
{char arr[] = "aaattt";size_t len = strlen(arr);printf("%d\n", len);//6char qqq[]={'a','b'};size_t lee = strlen(qqq);printf("%d\n",lee);//随机值return 0;
}

3.strlen的返回值是size_t(即无符号整数)

int main()
{char ch1[] = "abc";char ch2[] = "abcdef";if (strlen(ch1) - strlen(ch2) < 0)//3         -      6{printf("ch1<ch2");}else{printf("ch1>ch2");}
}
//最终的结果是ch1>ch2

3-6=-3,小于0,为什么输出是大于?

在这里说明,strlen的返回值是size_t,无符号整数-无符号整数=还是无符号整数,所以strlen(ch1) - strlen(ch1)的结果其实>0,所以输出>。

如果非要比较,可以将strlen的返回值强制类型转换为int,(int)strlen(ch1)-(int)strlen(ch2)。或者直接比较: if (strlen(ch1) < strlen(ch2) )

3.1 strlen 的模拟

1.计算器方法

(1.) 这是最初的版本,之后优化。

size_t my_strlen(char* str)
{int count = 0;while (*str != '\0'){count++;//个数+1str++;//下一个元素的地址}return count;
}
int main()
{char ch[] = "aaaqqq";size_t len = my_strlen(ch);//传数组传的是数组名(这里代表的是数组首元素地址)printf("%d\n", len);
}

(2.)1.万一指针是空指针呢?我们先用断言判断一下
2.我们只是想遍历一遍数组的每个元素,找到\0,并不希望有人将元素修改了,所以用const修饰*ch

#include<assert.h>
size_t my_strlen(const char* str)//用指针变量来接收地址
{int count = 0;assert(str != NULL);while (*str != '\0'){count++;//个数+1str++;//下一个元素的地址}return count;
}
int main()
{char ch[] = "aaaqqq";size_t len = my_strlen(ch);//传数组传的是数组名(这里代表的是数组首元素地址)printf("%d\n", len);
}

2.指针-指针的方法

用起始地址-\0的地址=就是中间的元素个数

这几种方法int main函数里的内容都一样,之后就不再展示,只展示my_strlen函数里的内容

size_t my_strlen(const char* str)
{int count = 0;assert(str != '\0');int start = str;//这里str还是起始元素的地址while (*str != '\0'){//通过这个循环,使得str里面放的是\0的地址str++;}int end = str;return end - start;
}

3.递归的方法

在这里插入图片描述

size_t my_strlen(const char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
}

4. strcpy的使用和模拟实现

5. strcat的使用和模拟实现

6. strcmp的使用和模拟实现

7. strncpy函数的使用

8. strncat函数的使用

9. strncmp函数的使用

10. strstr的使用和模拟实现

11. strtok函数的使用

12. strerror函数的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每周刷题第三期

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏&#xff1a;Python 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 目录 题目一&#xff1a;环形链表 题目二&#xff1a;删除有序数组中的重复项 题目三&#xff1a;有效的括号 题…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

Varjo XR-4功能详解:由凝视驱动的XR自动对焦相机系统

Varjo是XR市场中拥有领先技术的虚拟现实设备供应商&#xff0c;其将可变焦距摄像机直通系统带入到虚拟和混合现实场景中。在本篇文章中&#xff0c;Varjo的技术工程师维尔蒂莫宁详细介绍了这项在Varjo XR-4焦点版中投入应用的技术。 对可变焦距光学系统的需求 目前所有其他XR头…

WPF之容器标签之Canvas布局标签

Canvas: 定义一个区域&#xff0c;可在其中使用相对于 Canvas 区域的坐标以显式方式来定位子元素。 实例 可以在子标签使用Canvas属性设置定位 <Canvas Width"500" Height"300"><StackPanel Width"100" Height"100"Backgro…

指数分布的理解,推导与应用

指数分布的定义 在浙大版的教材中&#xff0c;指数分布的定义如下&#xff1a; 若连续型的随机变量 X X X的概率密度为&#xff1a; f ( x ) { 1 θ e − x θ , x>0 0 , 其他 f(x) \begin{cases} \frac{1}{\theta} e^{-\frac{x}{\theta}}, & \text{x>0}\\ 0, &a…

Python正则表达式与Excel文件名批量匹配技术文章

目录 引言 正则表达式基础 Python中的re模块 Excel文件名批量匹配案例 常见问题与解决方案 结论 引言 在现代办公环境中&#xff0c;Excel文件几乎成为了数据分析和处理的标配工具。由于Excel文件可能包含大量的数据和信息&#xff0c;因此&#xff0c;对Excel文件的命名…

在aspNetCore中 使用System.Text.Json的定制功能, 将定制化的json返回给前端

C# 默认大写, 而大部分的前端默认小写, 这时候可以如此配置: builder.Services.AddControllers().AddJsonOptions((opt) > {opt.JsonSerializerOptions.PropertyNamingPolicy System.Text.Json.JsonNamingPolicy.CamelCase;opt.JsonSerializerOptions.WriteIndented true…

DSPF网络类型实验1

对R6配置 对R1配置 对R2 对R3 对R4 对R5 对R1R2R3R4R5加用户 环回处理 然后开始配置缺省 R1有两个下一跳 3&#xff0c;4&#xff0c;5同R2 然后对R1 dynamic动态 对R2 手写 把注册加上 register R3同R2处理

医学图像分割

论文&#xff1a;Medical Image Segmentation Using Deep Learning: A Survey 参考&#xff1a;[医学图像分割综述] Medical Image Segmentation Using Deep Learning: A Survey-CSDN博客 一、背景 特征表示的困难&#xff1a;模糊、噪声、对比度低--->CNN属于语义分割&a…

Web Server项目实战2-Linux上的五种IO模型

上一节内容的补充&#xff1a;I/O多路复用是同步的&#xff0c;只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数&#xff0c;等待这个函数返回&#xff0c;期间什么也不做&#xff0c;不停地去检查这个函数有没有返回&#xff0c…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL&#xff0c;基于HIM&#xff0c;不依靠额外学习奖励函数 Intro 本研究聚焦于离线偏好引导的强化学习&#xff08;Offline Preference-based Reinforcement Learning, PbRL&#xff09;&#xff0c;这是传统强化学习&#x…

轻量音乐网站程序源码,在线音乐免费听歌

这是一个高品质的音乐共享和流媒体平台&#xff0c;用户可以在这个网站上免费在线听歌。这个轻量级的音乐网站程序源码&#xff0c;是您创建自己的音乐流媒体网站的最佳选择&#xff01;它还支持制作插件&#xff0c;并且在更新后&#xff0c;您可以保留您的自定义设置。 下 载…

Python基于PyQt6制作GUI界面——多选框

QCheckBox 是 PyQt6 中的一个复选框控件&#xff0c;它允许用户通过单击来选择或取消选择某个选项。与 QRadioButton 不同&#xff0c;QCheckBox 控件并不互斥&#xff0c;这意味着用户可以同时选择多个 QCheckBox。示例对应的制作的 ui文件 界面如下所示。 <?xml version…

【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 CMA算法&#xff08;恒模算法&#xff09; CMA&#xff08;Constant Modulus Algorithm&#xff0c;恒模算法&#xff09;是一种自适应盲均衡算法&#xff0c;主要用于消除信道对信号的码间干扰&#xff08;ISI&#xff09;…

Python使用thread模块实现多线程

介绍&#xff1a; 线程&#xff08;Threads&#xff09;是操作系统提供的一种轻量级的执行单元&#xff0c;可以在一个进程内并发执行多个任务。每个线程都有自己的执行上下文&#xff0c;包括栈、寄存器和程序计数器。 在Python中&#xff0c;可以使用threading模块创建和管理…

今日刷三题(day14):ISBN号码+kotori和迷宫+矩阵最长递增路径

题目一&#xff1a;ISBN号码 题目描述&#xff1a; 每一本正式出版的图书都有一个ISBN号码与之对应&#xff0c;ISBN码包括9位数字、1位识别码和3位分隔符&#xff0c;其规定格式如“x-xxx-xxxxx-x”&#xff0c;其中符号“-”是分隔符&#xff08;键盘上的减号&#xff09;&…

STM32使用旋转编码开关

一、旋转编码开关如何工作 编码器内部有一个开槽圆盘&#xff0c;连接到公共接地引脚 C。它还具有两个接触针 A 和 B&#xff0c;如下所示。 当您转动旋钮时&#xff0c;A 和 B 按照特定顺序与公共接地引脚 C 接触&#xff0c;具体顺序取决于转动旋钮的方向。 当它们与公共地接…

Web3 游戏平台 Creo Engine 销毁代币总量的20%,以促进长远发展

Creo Engine 5月16日进行了第三次代币销毁&#xff0c;这次的销毁占代币总量的 20%。一共销毁了2亿 $CERO 代币&#xff0c;市场价值接近 2000 万美元。 Creo Engine 致力于连接世界、为玩家提供一站式游戏中心&#xff0c;并提升 Web3 游戏体验。 Creo Engine 发布于2022年&am…

USB抓包工具:bushound安装及使用

一、环境搭建 下载busbound6.01安装包&#xff0c;安装完成&#xff0c;重启电脑。 二、工具配置 按照下图配置工具&#xff1a; 使能自动识别新设备 2. 设置抓取数据的容量 三、抓包 回到capture选项卡&#xff0c;在页面的右下角有个run的按钮&#xff0c;点击使能&…