常见的字符串函数(包含头文件string.h)和字符函数(2)
八. strstr函数
1.strstr的定义
char *strstr( const char *str1, const char *str2 );
->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置,记录并返回该位置的指针,如果找不到,则返回NULL
->2. str1:查找字符串的目标空间 str2:需要查找的对象字符串
->3. 因为strstr函数操作时不会改变形参的指向,所以我们在两个形参前面加上两个const
2.strstr的使用
例1:
记录子串在目标字符串中的位置,然后返回子串首地址
#include <stdio.h>
#include <string.h>void main(void)
{char* str1 = "Strive to improve yourself";char* str2 = "improve";char* det = strstr(str1, str2);if(ret == NULL){printf("字符串不存在!");}else{printf("%s", det);}
}
运行结果:
例2:
返回子串首地址在目标字符串中的具体位置(地址 - 地址的方法)
#include <stdio.h>
#include <string.h>void main(void)
{char* str1 = "Strive to improve yourself";char* str2 = "improve";char* det = strstr(str1, str2);int result = det - str1 + 1;if (det == NULL){printf("字符串不存在!");}else{printf("%d", result);}
}
运行结果:
例3:
记录目标空间中一共出现多少次子串
#include <stdio.h>
#include <string.h>void main(void)
{char* str1 = "Strive to improve improve yourself";char* str2 = "improve";char* p = str1;int count = 0;while (p = strstr(p, str2)){count++;p++;}printf("%d", count);
}
运行结果:
3.strstr的模拟实现
#include <stdio.h>
#include <assert.h>char* My_strstr(const char* str1, const char* str2)
{assert(str1 && str2);char* p = str1;char* s1 = str1;char* s2 = str2;while (*p){s1 = p;s2 = str2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return p;p++;}return NULL;
}int main()
{char* str1 = "abbbcdf";char* str2 = "bbc";const char* det = My_strstr(str1, str2);if (det == NULL){printf("字符串不存在!");}else{printf("%s", det);}return 0;
}
九. strtok函数
1.strtok的定义
char *strtok( char *strToken, const char *strDelimit );
->1. 作用:切割字符串。将分隔符转换成\0在将前面那个字符串的首地址返回给函数(返回\0前面的字符串)
->2. char *strToken 目标空间
->3. char *strDelimit 标记(分隔符)
2.strtok的使用
例1:
#include <stdio.h>
#include <string.h>int main()
{const char* sep = "@.";//三个分隔符 @ . \0 别忘了字符串还带有\0char email[] = "zhangsan@@nianxi.nbaiwan";char cp[30] = { 0 }; strcpy(cp, email); char *ret = strtok(cp, sep);if(ret != NULL){printf("%s ", ret);}return 0;
}
因为strtok函数会改变原字符串中的内容,所以一般都是使用临时拷贝的内容,并且可修改
运行结果:
strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
例2:
#include <stdio.h>
#include <string.h>int main()
{const char* sep = "@.";char email[] = "zhangsan@@nianxi.nbaiwan";char cp[30] = { 0 }; strcpy(cp, email); char *ret = strtok(cp, sep);if(ret != NULL){printf("%s\n", ret);}ret = strtok(NULL, sep);if(ret == NULL){printf(第二次没有找到该标记);}else{printf("%s\n", ret);}return 0;
}
如果两个标记在一起中间什么都没有,函数strtok就啥也获取不到,获取不到strtok会直接跳过
不管它,直接去找下一个标记
运行结果:
例3:
第三次分割
#include <stdio.h>
#include <string.h>int main()
{const char* sep = "@.";/* char email[] = "zhangsan@.nianxinbaiwan";*/char email[] = "zhangsan@@nianxi.nbaiwan";char cp[30] = { 0 };strcpy(cp, email);char* ret = strtok(cp, sep);if (ret != NULL){printf("%s\n", ret);}ret = strtok(NULL, sep);if (ret == NULL){printf("第二次没有找到该标记");}else{printf("%s\n", ret);}ret = strtok(NULL, sep);if (ret == NULL){printf("第三次什么也没获取到");}else{printf("%s\n", ret);}return 0;
}
运行结果:
例4:
如果strtok什么都没找到就会返回NULL
第四次从字符串末尾开始向后找,后面已经没有字符串了,所以找不到
#include <stdio.h>
#include <string.h>int main()
{const char* sep = "@.";/* char email[] = "zhangsan@nianxin.baiwan";*/char email[] = "zhangsan@@nianxi.nbaiwan";char cp[30] = { 0 };strcpy(cp, email);char* ret = strtok(cp, sep);if (ret != NULL){printf("%s\n", ret);}ret = strtok(NULL, sep);if (ret == NULL){printf("第二次没有找到该标记\n");}else{printf("%s\n", ret);}ret = strtok(NULL, sep);if (ret == NULL){printf("第三次什么也没获取到\n");}else{printf("%s\n", ret);}ret = strtok(NULL, sep);if (ret == NULL){printf("第四次什么也没获取到\n");}else{printf("%s\n", ret);}return 0;
}
运行结果:
因为每次都需要用if else来判断,有点重复不好看
所以我们将代码改进一下:
利用for循环
#include <stdio.h>
#include <string.h>int main()
{const char *sep = "@.";char email[] = "zhangsan@nianxin.baiwan";char pc[30] = { 0 };strcpy(pc, email);char *ret =0;ret = strtok(pc, sep);for(; ret != NULL; ret = strtok(NULL, sep)){printf("%s\n", ret);}return 0;
}
3.strtok的模拟实现
例1:
#include <stdio.h>
#include <string.h>
#include <assert.h>char* My_strtok(char* ps, const char* pc)
{assert(pc); //不用加上ps因为第二次用的话会传参NULLstatic char* str1 = NULL;static char* str2 = NULL;static int count = 0;static int sz1 = 0; int sz2 = 0;if(ps != NULL){str1 = ps;sz1 = strlen(ps);sz2 = strlen(pc);for(*ps; *ps != '\0'; ps++){for(int i = 0; i < sz2; i++){if(i == 0){count++;}if(*ps == *(pc + i)){*ps = '\0';str2 = ps;return str1;}}}else{str1 = str2 + 1;ps = str1;for(*ps; *ps = '\0'; ps++){for(int i = 0; i < sz2; i++){if(i == 0){count++;}if(*ps == *(pc + i)){ps = '\0';str2 = psreturn str1;}}}if(count == sz1){return NULL;}return str1;}
}
int main()
{const char* pc ="b";char email[] ="nianxinbaiwan";char ps[30] = { 0 };strcpy(ps, email);char* ret = My_strtok(ps, pc);for(; ret != NULL; ret = My_strtok(NULL, pc)){printf("%s\n", ret);}return 0;
}
十. strerror函数
1.strerror的定义
char *strerror( int errnum );
->1.返回值是字符型的指针
->2.int errnum 错误码:C语言的数据库,在执行失败的时候,都会自动设置错误码
0:No error
1:Operation not permitted
2:No such file or directory
3:No such process
4:Interrupted function call
5:Input/output error
6:No such device or address
7:Arg list too long
8:Exec format error
9:Bad file descriptor
errno - C语言设置的一个全局的错误码存放的变量
2.strerror的使用
#include <stdio.h>
#include <errno.h>int main()
{FILE* pf = fopen("idea.txt", "w");if(pf == NULL){printf("%d", strerror(errno));return 1;}fputc("w");fclose(pf);pf = NULL;return 0;
}
运行结果:
十一. 字符分类函数
包含头文件 ctype
1.isspace -> 判断是否是空白字符,是就返回非0,不是就返回0
int a = isspace(' ');
printf("%d", a);
2.isdigit -> 判断是否是数字字符,是就返回非0,不是就返回0
int a = isdigit('x');printf("%d", a);
3.iscntrl -> 任何控字符
4.isxdigit -> 十六进制数字,包括十进制数字,小写字母a - f,大写字母A - F
5.islower -> 小写字母a - z
6.isupper 大写字母A - Z
7.isalpha 字母a - z或A - Z
8.isalnum 字母或数字,a - z,A - Z,0 - 9
9.ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
10.isgraph 任何图像字符
11.isprint 任何打印字符,包括图形字符和空白字符
十二. tolower函数
1. tolower的使用
printf("%c\n", tolower('W'));
2.tosupper -> 转大写
十三. memcpy
1.memcpy的定义
void* memcpy(void* destination, const void* source, size_t num);
万能copy函数,什么类型的都可以拷贝
memcpy负责拷贝两块独立的空间中的数据
->1. void* destination 目标空间
->2. void* source 源空间
->3. size_t num 源空间总大小
2.memcpy的使用
例1:
整型拷贝
#include <stdio.h>
#include <string.h>int main()
{int arr1[] = {1, 2, 3, 4, 5, 6, 7, };int arr2[10] = { 0 };memcpy(arr2, arr1, 28);int i = 0;for(i = 0; i < sizeof(arr2)/sizeof(arr2[0]); i++){printf("%d ", arr2[i]);}return 0;
}
运行结果:
例1:
浮点型拷贝
#include <stdio.h>
#include <string.h>int main()
{float arr1[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, };float arr2[10] = { 0.0 };memcpy(arr2, arr1, 28);int i = 0;for (i = 0; i < sizeof(arr2) / sizeof(arr2[0]); i++){printf("%d ", arr2[i]);}return 0;
}
运行结果:
tips:
strcpy和memcpy的区别:
1.复制内容不同,strcpy只能复制字符类型,而memcpy可以复制任意类型
2.所需参数不同,strcpy只需要目标空间和源空间,而memcpy在次之上还需要源空间总大小
3.用途不同,字符类的复制用strcpy,其他类型的复制使用memcpy
3.memcpy的模拟实现
我们写的这个模拟实现的memcpy是不能实现重叠空间的拷贝的
#include <stdio.h>
#include <assert.h>void* My_memcpy(void* det, const void* src, size_t num)
{assert(det&&src);void* p = det;while(num--){*(char*)det = *(char*)src;det = (char*)det + 1;src = (char*)src + 1; }return p;
}
为什么不使用(char*)src++,(char*)det++这种写法,因为这种写法有点问题,有些编译器是不支持这样写的,被(char*)强转了就是一个临时的变量,对一个临时的变量进行操作是有问题的
用自定义函数My_memcpy进行重复空间的拷贝
#include <stdio.h>
#include <assert.h>void* My_memcpy(void* det, const void* src, size_t num)
{assert(det && src);void* p = det;while (num--){*(char*)det = *(char*)src;det = (char*)det + 1;src = (char*)src + 1;}return p;
}
void test()
{int a[] = { 1,2,3,4,5,6,7,8,9,10 };//int b[20] = { 0 };My_memcpy(a + 2, a, 28);int i = 0;for (i = 0; i < 10; i++){printf("%d ", a[i]);}
}
int main()
{test();return 0;
}
运行结果:
由上图知:第三第四元素地址被第一第二元素地址覆盖了,后面拿第三第四元素内容和第一第二元素一样,后面的地址跟前面的同理,就会出现如图这样的结果
tips:
上面说了,memcpy用于单独的两个空间(重叠的内存也能实现,但是C中规定它只能用于单独的两个空间),那重叠内存的拷贝应该用什么函数 - > memmove
十四. memmove函数
1.memmove的定义
void *memmove( void *dest, const void *src, size_t count );
负责拷贝重复空间中的数据
->1. void* destination 目标空间
->2. void* source 源空间
->3. size_t num 需要拷贝的字节数
它的目标空间和源空间是同一个空间
2.memmove的使用
#include <stdio.h>
#include <string.h>int main()
{int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};memmove(a + 2, a, 20);int i = 0;for(i = 0; i < 10; i++){printf("%d ", a[i]);}return 0;
}
运行结果:
3.memmove的模拟实现
#include <stdio.h>
#include <assert.h>void* My_memmove(void* det, const void* src, size_t num)
{assert(det&&src);void* p = det;if (det < src){while (num--){*(char*)det = *(char*)src;det = (char*)det + 1;src = (char*)src + 1;}}else{while (num--){*((char*)det + num) = *((char*)src + num);}}return p;
}
int main()
{int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };My_memmove(a + 1, a + 2, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", a[i]);}return 0;
}
运行结果:
相关文章:
常见的字符串函数(包含头文件string.h)和字符函数(2)
八. strstr函数 1.strstr的定义 char *strstr( const char *str1, const char *str2 ); ->1. strstr查找子串(str2)在字符串(str2)中第一次出现的位置,记录并返回该位置的指针,如果找不到,则返回NULL ->2. str1:查找字符…...
Python | Leetcode Python题解之第187题重复的DNA序列
题目: 题解: L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…...
SpringCloud分布式微服务链路追踪方案:Skywalking
一、引言 随着微服务架构的广泛应用,系统的复杂性也随之增加。在这种复杂的系统中,应用通常由多个相互独立的服务组成,每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性,但也带来了新的挑战…...
首次线下联合亮相!灵途科技携手AEye、ATI亮相2024 EAC 易贸汽车产业大会
6月22日,2024 EAC 易贸汽车产业大会在苏州国际博览中心圆满落幕,泛自动驾驶领域光电感知专家灵途科技携手自适应高性能激光雷达解决方案全球领导者AEye公司(NASDAQ:LIDR)及光电器件规模化量产巨头Accelight Technologiesÿ…...
一文入门CMake
我们前几篇文章已经入门了gcc和Makefile,现在可以来玩玩CMake了。 CMake和Makefile是差不多的,基本上是可以相互替换使用的。CMAke可以生成Makefile,所以本质上我们还是用的Makefile,只不过用了CMake就不用再写Makefile了&#x…...
【LeetCode面试经典150题】117. 填充每个节点的下一个右侧节点指针 II
一、题目 117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) 给定一个二叉树: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个…...
RTDETR更换优化器——Lion
RTDETR更换Lion优化器 论文:https://arxiv.org/abs/2302.06675 代码:https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介: Lion优化器是一种基于梯度的优化算法,旨在提高梯度下降法在深度学习中的优化效果…...
Spring Boot中最佳实践:数据源配置详解
Spring Boot中最佳实践:数据源配置详解 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Spring Boot中如何进行最佳实践的数据源…...
第1章 物联网模式简介---独特要求和体系结构原则
物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外,物联网实施的固有复杂性(一端的现场设备在计算上受到挑战,另一端的云容量几乎无限)迫使架构师做出艰难的架构决策和实施选择。可用实现技…...
数据挖掘概览
数据挖掘(Data Mining)就是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的信息和知识的过程. 预测性数据挖掘 分类 定义:分类就是把一些新的数据项映射到给定类别中的某一个类别 分类流程&#x…...
【学习】软件测试中常见的文档类型及其作用
在软件开发的生命周期中,软件测试是确保产品质量的关键步骤。为了系统地进行测试活动,并保证测试结果的有效性和可追溯性,产生了一系列标准化的测试文档。这些文档不仅为测试人员提供了执行指南,而且为项目管理者和利益相关者提供…...
electron的托盘Tray
1.在主进程文件background.js中引入需要的文件 import { Tray, Menu } from "electron"; const path require("path");2.获取托盘图标 const baseSRC process.cwd(); //这里不能使用__dirname,使用dirname会直接获取dist_electron中的文件,…...
Harmony OS UI框架探索笔记
本文探讨了如何将现有的常用架构理论与Arkts和ArkUI结合起来,使代码更有条理,并利用Previewer快速调整布局,同时在不改变代码的情况下运行显示真实数据。 开发环境 Windows 11DevEco Studio 4.0 ReleaseBuild Version: 4.0.0.600, built on…...
transformers evaluate
☆ Evaluate https://huggingface.co/docs/evaluate/main/en/installation ★ 解决方案 常用代码 # 查看支持的评估函数 evaluate.list_evaluation_modules(include_communityTrue)# 加载评估函数 accuracy evaluate.load("accuracy")# load function descripti…...
【ONLYOFFICE深度探索】:ONLYOFFICE桌面编辑器8.1震撼发布,打造高效办公新境界
文章目录 一、功能完善的PDF编辑器:解锁文档处理新维度二、幻灯片版式设计:释放创意,打造专业演示三、改进从右至左显示:尊重多元文化,优化阅读体验四、新增本地化选项:连接全球用户,跨越语言障…...
C++系统相关操作4 - 获取CPU(指令集)架构类型
1. 关键词2. sysutil.h3. sysutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词: C 系统调用 CPU架构 指令集 跨平台 实现原理: Unix-like 系统: 可以通过 uname -m 命令获取 CPU 架构类型。Windows 系统: 可以通过环境变量 PROCESSOR_A…...
whisper 实现语音转文字
准备需要转码的音频 https://support.huaweicloud.com/sdkreference-sis/sis_05_0039.html 编码转吗的代码 import whisperif __name__ "__main__":file_path "16k16bit.wav"model whisper.load_model("small")result model.transcribe(f…...
使用VLLM部署llama3量化版
1.首先去魔塔社区下载量化后的llama3模型 git clone https://www.modelscope.cn/huangjintao/Meta-Llama-3-8B-Instruct-AWQ.git 2.跑起来模型 1)python -m vllm.entrypoints.openai.api_server --model /home/cxh/Meta-Llama-3-8B-Instruct-AWQ --dtype auto --…...
计算机缺失OpenCL.dll怎么办,OpenCL.dll丢失的多种解决方法
在使用电脑的过程中,我们经常会遇到一些开机弹窗问题。其中,开机弹窗找不到OpenCL.dll是一种常见的情况。本文将详细介绍开机弹窗找不到OpenCL.dll的原因分析、解决方法以及预防措辞,帮助大家更好地解决这一问题。 一,了解OpenCL.…...
git 本地代码管理
简介 git 能实现本地代码多个更改版本的管理和导出。 首先复制好项目(参考 git clone 别人项目后正确的修改和同步操作 中的前三步) 实操 克隆原始项目 首先,从远程仓库克隆项目到本地: git clone https://github.com/libo-huan…...
Docker(九)-Docker运行redis6.0.8容器实例
1.宿主机新建目录存放redis.conf文件 目的:运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…...
似然 与 概率
概率似然概率函数与似然函数的关系似然与机器学习的关系最大似然估计 似然与概率分别是针对不同内容的估计和近似 概率 概率:概率表达给定参数 θ \theta θ下样本随机向量 X x \textbf{X} {x} Xx的可能性。 概率密度函数的定义形式是 f ( x ∣ θ ) f(x|\t…...
Tableau数据可视化与仪表盘搭建
Tableau的主要目的 数据赋能和数据探索。 数据赋能: 1.分析师可以将数据看板发布到线上给其他部门使用 2.自动更新看板 3.自由下载数据 4.线上修改图表 5.邮件发送数据 6.设置数据预警 数据探索: 1.支持亿级数据的连接和处理 2.自由地对字段进行各种…...
web前端——HTML
目录 一、HTML概述 1.HTML是什么? 2.HTML具体化解释 二、HTML基本语法 1.声明 2. Head头标签 3.body身体标签 4.一个html的基本结构 5.标签 6.标签属性 ①属性的格式 ②属性的位置 ③添加多个属性 三、基本常用标签 1.超链接 2.图像标签 ①图像标…...
C++的模板(九):模板的实例化问题
前文子系统中的例子, SubSystem内部用了STL库的map模板: template <class Event, class Response> class SubSystem{ public:map<Event*, Response*> table; public:void bind(Event *e, Response *r);void unbind(Event *e); public:int OnMessage(E…...
Clickhouse Projection
背景 Clickhouse一个视图本质还是表,只支持一种order By,不然要维护太多的视图。 物化视图能力有限。 在设计聚合功能时,考虑使用AggregatingMergeTree表引擎,现在有了projections,打算尝试使用一下 操作 ADD PROJE…...
放烟花短视频素材去哪里找?去哪里下载?烟花素材网分享
在当代社会,短视频凭借其独有的魅力成为大众传递情感、记录生活、分享快乐的新兴方式。特别是在庆祝节日和特殊时刻时,烟花的绚丽效果常常被用来吸引观众的目光,成为视频作品中的亮点。然而,对于短视频制作者来说,寻找…...
爬虫笔记14——爬取网页数据写入MongoDB数据库,以爱奇艺为例
下载MongoDB数据库 首先,需要下载MongoDB数据库,下载的话比较简单,直接去官网找到想要的版本下载即可,具体安装过程可以看这里。 pycharm下载pymongo库 pip install pymongo然后在在python程序中我们可以这样连接MongoDB数据库…...
Jenkins教程-10-发送飞书测试报告通知
上一小节我们学习了发送企业微信测试报告通知的方法,本小节我们讲解一下发送飞书测试报告通知的方法。 1、自动化用例执行完后,使用pytest_terminal_summary钩子函数收集测试结果,存入本地status.txt文件中,供Jenkins调用 conft…...
Swift开发——简单App设计
App的界面设计需要具有大量的图像并花费大量的时间,这样的应用不方便学习和交流,这里重点介绍SwiftUI界面元素的用法,通过简单App设计过程的讲解,展示图形用户界面应用程序的设计方法。 01、简单App设计 按照9.1节工程MyCh0901的创建方法,创建一个新的工程MyCh0902,此时工…...
东莞厚街网站建设/网站排名软件
转自 http://cryinstall.com/?p121 Mr高 被钟大神忽悠装了Opensuse,然后这俩家伙对装系统的引导项设置不对劲,Opensuse的grub直接装到硬盘的MBR上, 然后华丽丽的把原来Fedora 16的grub2给覆盖了,接着Opensuse又识别不了grub2,….…...
成都哪里做网站/宁波网站推广优化
前端页面性能问题: 前端性能包括:网络层面、构建层面、服务端层面、浏览器渲染层面的优化 页面响应时间:白屏时间、首屏时间、网页加载时间、资源加载时间、整页加载时间 性能优化点背后的原理 谷歌优化:performs、 players工具…...
ssr网站怎么做/个人接广告的平台
SyncNavigator v8.6.2 SyncNavigator是一款功能强大的数据库同步软件,适用于SQL SERVER, MySQL,具有自动/定时同步数据、无人值守、故障自动恢复、同构/异构数据库同步、断点续传和增量同步等功能,支持Windows xp以上所有操作系统࿰…...
网站没收录了怎么办/有什么软件可以推广
进来学习C语言碰到了指针,着实学了一段时间,搞不出个头绪,今日感觉有些眉目,来此做个记录,也望能给困顿的人一起分享下感悟。学习指针还要从变量,数组,函数的定义这些基础说起。如:i…...
把网站放到服务器上/免费com域名注册永久
11月24日消息,在上海举行的SyScan360亚太前瞻信息安全技术年会上,360车联网安全中心宣布正式成立,该中心由360公司联合多家高校、汽车及零部件企业组建,是国内第一个专业从事汽车及车联网的安全保护的跨行业合作机构。 信息安全成…...