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

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客

今天接着来介绍一些: 


目录

一.字符串查找

1.strstr()

1.1示例

1.2注意事项:

1.3模拟实现

 2.strtok()

 2.1示例

2.2注意事项

 二.错误信息报告

1.strerror()

 1.1示例

1.2注意事项:

 三.内存操作函数

1.memcpy()

1.1示例

1.2注意事项

2.memmove()

 2.1示例

 2.2注意事项:

3.memset()

 3.1示例

 3.2注意事项:

 4.memcmp()

4.1示例

4.2注意事项:


一.字符串查找

1.strstr()

strstr是一个C标准库函数,用于在一个字符串中查找另一个字符串的第一次出现的位置。它的原型如下:

char *strstr(const char *haystack, const char *needle);

strstr函数接受两个参数,haystack是要搜索的字符串,needle是要查找的子字符串。函数返回一个指向第一次出现的子字符串的指针,如果找不到子字符串,则返回NULL

下面是strstr函数的工作原理:

  1. 首先,strstr函数会在haystack字符串中搜索needle字符串的第一个字符

  2. 一旦找到了与needle的第一个字符匹配的字符,strstr函数会继续比较haystack中的后续字符和needle中的字符,直到找到一个不匹配的字符或者needle中的所有字符都匹配

  3. 如果找到了完全匹配的子字符串,strstr函数会返回指向该子字符串的指针

  4. 如果在haystack中找不到子字符串,或者needle是一个空字符串,则strstr函数会返回NULL

1.1示例

int main()
{char arr1[] = "abcdef";char arr2[] = "cd";printf("%s", strstr(arr1, arr2));return 0;
}

 如果找到了完全匹配的子字符串,strstr函数会返回指向该子字符串的指针,结果如下:

1.2注意事项:

strstr函数是区分大小写的,如果要进行大小写不敏感的字符串比较,可以使用其他函数 

1.3模拟实现

char* my_strstr(const char* a1, const char* a2)
{char* cp = a1;char* str1 = a1;char* str2;while (*cp){str1 = cp;str2 = a2;while (*str1&&*str2&&*str1 == *str2){str1++;str2++;}if (*str2 == '\0'){return cp;}cp++;}return NULL;
}int main()
{char arr1[] = "abcdef";char arr2[] = "cd";printf("%s", my_strstr(arr1, arr2));return 0;
}

 2.strtok()

strtok是一个C标准库函数,用于将一个字符串分割成多个子字符串。它的原型如下:

char * strtok (char *str ,  const char *delim);

其中,str是要分割的字符串delim是用作分隔符的字符串。函数返回一个指向分割后的第一个子字符串的指针,如果没有更多的子字符串,则返回NULL

strtok函数使用一个静态变量来保存当前的分割位置,因此在多次调用strtok时,需要将原始字符串传递给第一次调用,而后续的调用只需要传递NULL作为第一个参数

  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记

 2.1示例

int main()
{char arr[] = "123@abc%ABC";char a[] = "@%";printf("%s\n", strtok(arr, a));/*printf("%s\n", strtok(NULL, a));*/return 0;
}

 结果如下:

 

int main()
{char arr[] = "123@abc%ABC";char a[] = "@%";printf("%s\n", strtok(arr, a));printf("%s\n", strtok(NULL, a));printf("%s\n", strtok(NULL, a));return 0;
}

 结果如下:

 充分利用性质可以写出这样的代码:

int main()
{char arr[] = "123@abc%ABC";char a[] = "@%";/*printf("%s\n", strtok(arr, a));printf("%s\n", strtok(NULL, a));printf("%s\n", strtok(NULL, a));*/for (char* ret = strtok(arr, a); ret != NULL;ret= strtok(NULL, a)){printf("%s\n", ret);}return 0;
}

2.2注意事项

需要注意的是,strtok函数会修改原始字符串,将分隔符替换为NULL字符。如果需要保留原始字符串,可以使用副本进行分割操作 


 二.错误信息报告

1.strerror()

strerror是一个C标准库函数,用于将错误码转换为对应的错误信息字符串。它的原型如下:

char * strerror( int errnum );

其中,errnum是错误码。函数返回一个指向错误信息字符串的指针

  • errnum是一个整数类型的错误码,通常用于表示函数调用或操作的结果状态
  • errno是一个全局变量,用于存储最近一次发生的错误码。当函数调用或操作失败时,它们通常会设置errno为一个非零的错误码,以指示错误的类型

 1.1示例

输出1~10分别代表的错误信息:

int main()
{for (int i = 1; i <= 10; i++){printf("%s\n", strerror(i));}return 0;
}

结果如下:
 

1.2注意事项:

strerror函数返回的指针指向的是一个静态分配的字符串,因此在多线程环境下不是线程安全的


 三.内存操作函数

1.memcpy()

memcpy是一个标准C库函数,用于将一段内存区域的数据复制到另一段内存区域。它的函数原型如下:

void *memcpy(void *dest, const void *src, size_t n);

其中,dest是目标内存区域的指针,src是源内存区域的指针,n是要复制的字节数。

memcpy函数将源内存区域的n个字节复制到目标内存区域中。如果源和目标区域重叠,memcpy函数的行为是未定义的。如果需要处理重叠区域的复制,可以使用memmove函数(下面介绍)

这个函数在遇到 '\0' 的时候并不会停下来 

1.1示例

int main() 
{char src[] = "Hello, world!";char dest[20];memcpy(dest, src, strlen(src) + 1);printf("source string: %s\n", src);printf("copied string: %s\n", dest);return 0;
}

结果如下:

 

1.2注意事项

需要注意的是,memcpy函数不会自动添加字符串结束符\0,因此在复制字符串时需要将\0一起复制。在上面的示例中,strlen(src) + 1计算了源字符串的长度,并将其加1,以便复制\0 

2.memmove()

memmove是一个标准C库函数,用于将一段内存区域的数据复制到另一段内存区域,与memcpy函数类似。但是,memmove函数可以处理源和目标区域重叠的情况,而memcpy函数则不能

memmove函数的函数原型如下:

void *memmove(void *dest, const void *src, size_t n);

其中,dest是目标内存区域的指针,src是源内存区域的指针,n是要复制的字节数。

memmove函数将源内存区域的前n个字节复制到目标内存区域中。如果源和目标区域重叠,memmove函数会确保复制的结果是正确的,即使源和目标区域重叠。因此,memmove函数比memcpy函数更安全,但通常也更慢

 2.1示例

int main() 
{char str[] = "123456";memmove(str,str+3,3);printf("%s\n", str);return 0;
}

 结果如下:

 2.2注意事项:

需要注意的是,memmove函数和memcpy函数一样,不会自动添加字符串结束符\0,因此在复制字符串时需要将\0一起复制

3.memset()

memset是一个用于设置内存块内容的函数。它可以将指定的内存块中的每个字节都设置为特定的值。

memset函数的原型如下:

void *memset(void *ptr, int value, size_t num);

参数说明:

  • ptr:指向要设置的内存块的指针。
  • value:要设置的值,以整数形式提供。
  • num:要设置的字节数。

memset函数将ptr指向的内存块的num个字节设置为value指定的值

 3.1示例

int main() 
{char str[20] = { 0 };memset(str, 'A', 10);printf("%s\n", str);return 0;
}

 结果如下:

 3.2注意事项:

需要注意的是,memset函数是按字节进行设置的,因此对于非字符类型的数组,需要将value参数转换为相应的字节表示

 4.memcmp()

memcmp函数用于比较两个内存区域的内容是否相同,其原型如下:

int memcmp(const void *ptr1, const void *ptr2, size_t num);

参数说明:

  • ptr1:指向第一个内存区域的指针。
  • ptr2:指向第二个内存区域的指针。
  • num:要比较的字节数。

memcmp函数将ptr1指向的内存区域和ptr2指向的内存区域的前num个字节进行比较,返回值如下:

  • 如果两个内存区域相同,返回0。
  • 如果第一个内存区域小于第二个内存区域,返回负整数。
  • 如果第一个内存区域大于第二个内存区域,返回正整数

4.1示例

int main() 
{char str1[20] = "Hello, world!";char str2[20] = "Hello, world!";int result1 = memcmp(str1, str2, strlen(str1));printf("result = %d\n", result1);return 0;
}

结果如下:


 

4.2注意事项:

memcmp函数比较的是字节,因此对于非字符类型的数组,比较的结果可能与预期不同 

 


好了各位,这次的内容就先整理到这里吧!下次按照学习计划就打了结构体的部分知识内容啦! 

相关文章:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

上篇文章介绍了一些常用的字符串函数&#xff0c;大家可以跳转过去浏览一下&#xff1a;c语言进阶部分详解&#xff08;详细解析字符串常用函数&#xff0c;并进行模拟实现&#xff08;上&#xff09;&#xff09;_总之就是非常唔姆的博客-CSDN博客 今天接着来介绍一些&#x…...

一文看懂光模块的工作原理

你们好&#xff0c;我的网工朋友 光模块有很多类别&#xff0c;是我们经常要用到的PHY层器件。虽然封装&#xff0c;速率&#xff0c;传输距离有所不同&#xff0c;但是其内部组成基本是一致的。 以太网交换机常用的光模块有SFP&#xff0c;GBIC&#xff0c;XFP&#xff0c;X…...

基于SpringBoot的桂林旅游景点导游平台

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 景点类型管理 景点信息管理 线路推荐管理 用户注册 线路推荐 论坛交流 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…...

【小程序 - 加强】自定义组件、使用npm包、全局数据共享、分包_05

目录 一、自定义组件 1. 组件的创建与引用 1.1 创建组件 1.2 引用组件 1.2.1 局部引用组件 1.2.2 全局引用组件 1.2.3 全局引用 VS 局部引用 1.2.4 组件和页面的区别 2. 样式 2.1 组件样式隔离 2.2 组件样式隔离的注意点 2.3 修改组件的样式隔离选项 2.4 styleIso…...

Vue.js3学习篇--Vue模板应用

目录 一,模板基础 1.模板插值 &#xff08;1&#xff09;基础插值 &#xff08;2&#xff09;HTML代码插值 &#xff08;3&#xff09;标签属性插值 2.模板指令 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;指令参数 二.条件渲染 1.使用v-if指令渲染 2.使…...

【软考】5.2 传输介质/通信方式/IP地址/子网划分

《传输介质》 双绞线&#xff1a;网线&#xff1b;传输距离在100m以内 无屏蔽双绞线&#xff1a;UTP&#xff1b;可靠性相对较低屏蔽双绞线&#xff1a;STP&#xff1b;屏蔽怕干扰&#xff1b;可靠性相对较高&#xff1b;一般用于对传输可靠性要求很高的场合 网线&#xff1a…...

软件测试银行项目网上支付接口调用测试实例

公司最近有一个网站商城项目要开始开发了&#xff0c;这几天老板和几个同事一起开着需求会议&#xff0c; 讨论了接下来的业务规划和需求策略&#xff0c;等技术需求一下来还要讨论技术需求&#xff0c; 确认后再慢慢的进入开发阶段&#xff0c;趁着闲暇时间新造的人想总结一…...

w806 adc 中断扫描通道采集

用到了该芯片adc 扫描4个adc 通道&#xff0c;官方的死循环等待非常浪费时间&#xff0c;这里改用adc 中断采集方式&#xff0c;记录一下 int32_t adcFilterSum[4]{0}; int32_t detec_adc_value[4]{0};//mV int16_t detec_convt_ok[4]{0};/*is OK*/ ADC_HandleTypeDef hadc;vo…...

使用CSS的Positions布局打造响应式网页

在当今移动互联网的时代&#xff0c;响应式网页设计已经成为了一个必备的技能。通过使用CSS Positions布局&#xff0c;我们可以轻松地实现一个响应式的网页&#xff0c;使网页能够在不同的屏幕尺寸下自动适应。本文将介绍如何使用CSS Positions布局来打造一个响应式网页&#…...

模型训练环境相关(CUDA、PyTorch)

模型训练环境相关&#xff08;CUDA、PyTorch&#xff09; 1. 查看当前 GPU 所能支持的最高版本的 CUDA2. 如何判断是否安装了 CUDA3. 安装 PyTorch3.1 创建虚拟环境3.2 激活并进入虚拟环境3.3 安装 PyTorch 1. 查看当前 GPU 所能支持的最高版本的 CUDA 打开 NVIDIA 控制面板&a…...

链动2+1模式:社交电商行业的新型商业模式与营销手段

链动21模式是近年来在社交电商行业中崭露头角的一种新型商业模式和营销手段。在经历了多年的发展之后&#xff0c;社交电商行业已经进入了一个竞争激烈、用户获取成本高昂的阶段。在这个阶段&#xff0c;如何迅速吸引用户并增加他们的留存率和复购率成为了亟待解决的问题。 为了…...

竞赛选题 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…...

LuatOS-SOC接口文档(air780E)-- fskv - kv数据库,掉电不丢数据

示例 -- 本库的目标是替代fdb库 -- 1. 兼容fdb的函数 -- 2. 使用fdb的flash空间,启用时也会替代fdb库 -- 3. 功能上与EEPROM是类似的 fskv.init() fskv.set("wendal", 1234) log.info("fskv", "wendal", fskv.get("wendal"))--[[ fs…...

一篇文章教你Pytest快速入门和基础讲解,一定要看!

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架出去面试也好&#xff0c;跟别…...

SpringBoot项目:Cannot find declaration to go to

SpringBoot项目get,set方法总报Cannot find declaration to go to 搜了很多答案&#xff0c;没解决 后来仔细一想&#xff0c;原来是我的idea软件重装了&#xff0c;lombok插件没重新安装导致。 安装步骤&#xff1a; 1、下载地址&#xff1a;https://plugins.jetbrains.com…...

【高并发】多线程和高并发提纲

文章目录 三大源头两个主要问题三大解决方案 最近正在面试&#xff0c;对多线程和高并发相关问题整理了一个简单的提纲。 个人感觉这三大部分由底向上&#xff0c;足够引出对并发编程中大部分问题的讨论~ 三大源头 线程切换带来的原子性问题。 原子操作&#xff1a;利用CPU提…...

vue.js处理数组对象中某个字段是否变为两个字段

一、场景&#xff1a; 产品要求做一个时间步骤条&#xff0c;使用目前后端已返回的数据进行操作实现。时间步骤条要求日期和时间分开显示且相同日期只显示第一个日期。 图左边为实现效果&#xff0c;右边为后台返回的接口。接口中current字段表示当前到达第几步&#xff0c;从…...

从零开始的C++(补充三的内容)

auto:在编译阶段根据数据的类型确认auto所代表的类型&#xff0c;并将auto换成对应的类型。 特点&#xff1a; 1、auto所能代表的类型必须是在编译阶段就能确认的。 2、auto修饰的变量必须初始化&#xff0c;否则编译器无法判断auto的实际类型。 3、auto会根据第一个数据来…...

微信小程序通过createSelectorQuery获取元素 高度,宽度与界面距离

小程序官方有提供给我们一个 const query wx.createSelectorQuery() 函数 我们可以先编写这样一段代码 wxml <view><button bindtap"getDom">点击查看</button><view class "textIn" style "height: 100px;width: 30px;&quo…...

MySQL-事务

MySQL-事务 1.什么是事务 举例&#xff1a;想象炒菜的过程。 洗菜切菜炒菜装盘 我相信缺少任何任何一个步骤&#xff0c;都不完美&#xff01;&#xff01;&#xff01;可以将炒菜的过程理解为一个事务&#xff0c;是一组操作的集合&#xff0c;而MySQL中的事务也是如此。但…...

自动定时删除磁盘文件的脚本(从文件日期最早的开始删)

#!/bin/bash# 指定的挂载点 MOUNTPOINT"/media/vm/MyDisk512GB"# 设置磁盘大小的限制 (例如&#xff1a;800G) LIMIT$((800 * 1024 * 1024)) # 单位是KB# 获取挂载点的已使用空间 USED_SPACE$(df -kP "$MOUNTPOINT" | tail -1 | awk {print $3})echo &quo…...

拆解CPU的基本结构和运行原理

CPU的基本结构 CPU是一个计算系统的核心 南北桥芯片将CPU与外设连接起来 CPU执行流程 CPU的电路基础 组合电路基本原理 时序电路基本原理 多核成为主流 汇编语言和寄存器 中断的基本原理 中断的产生 中断服务程序 CPU 做为计算机的总司令官&#xff0c;它管理着计算…...

Docker安装——Ubuntu (Jammy 22.04)

一、为什么要用 Ubuntu&#xff1f;(centos和ubuntu有什么区别&#xff09; 使用lsb_release命令&#xff1a;lsb_release -a &#xff0c;即可查看ubantu的版本&#xff0c;但是为什么要使用ubantu 呢&#xff1f; 区别&#xff1a;1、centos基于EHEL开发&#xff0c;而ubunt…...

Fast DDS之Transport

目录 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP&#xff0c;TCP&#xff0c;SHM。...

爱普生L125X_L325X系列打印机Wi-Fi配置方法(Smart Panel)

准备工作&#xff1a; 手机需要下载“Epson Smart Panel”APP&#xff1b; 配置无线&#xff08;Wi-Fi&#xff09;方法 说明&#xff1a;SSID名称&#xff08;Wi-Fi名&#xff09;不能包含中文字符,路由器需要选择2.4GHz频段; 1. 打开“Epson Smart Panel”软件&#xff0…...

【回顾一下Docker的基本用法】

文章目录 回顾一下Docker的基本用法1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.…...

【Python】Python基础知识

【Python】Python基础知识 关键字 查看Python关键字&#xff1a; >python >>>import keyword >>>keyword.kwlist 注释 注释有两方面作用&#xff1a; &#xff08;1&#xff09;提高程序的可读性&#xff08;最重要的作用&#xff09;&#xff1b…...

【计算机视觉 05】YOLO论文讲解:V1-V7

https://ai.deepshare.net/live_pc/l_63243a65e4b050af23b79338 Part1.目标检测与YOLO系列 1. 目标检测任务及发展脉络 2. YOLO的发展史 Anchors Base原理&#xff1a; Part2.YOLOV1-V3 3. YOLO V1的网络结构 4. YOLO V3的网络结构与实验结果 Part3.YOLO的进化 5. YOLO V4的网络…...

git全局与单仓库的密码管理

概要 在使用git时&#xff0c;有默认的全局配置&#xff0c;每个仓库也有自己的配置&#xff0c;在使用时常常傻傻分不清楚&#xff0c;现在进行一个简单的整理记录。 一般情况下全局配置中的git账号和邮箱通常设置成自己的&#xff0c;其他仓库再根据项目需要进行单独配置&a…...

IDEA的使用(一) (IntelliJ IDEA 2022.1.3版本)

目录 1. IDEA项目结构 2. 模块的导入操作 2.1 正规操作 2.2 取巧操作 2.3 出现乱码 2.4 模块改名 3. 代码模板的使用 后缀补全&#xff08;Postfix Completion&#xff09;、实时模板&#xff08;Live Templates&#xff09;菜单里面什么介绍都有&#xff0c;可以自学&a…...

购物网站html/seo排名计费系统

用Eclipse在线安装的方式&#xff1a;Help-->Install New Software 地址输入&#xff1a;http://m2eclipse.sonatype.org/sites/m2e/&#xff0c;列表中打勾勾上后点击Next 安装maven插件时遇到了如下的错误&#xff1a; Cannot complete the install because one or more …...

自己做的网站可以买东西吗/班级优化大师怎么下载

简单工厂&#xff0c;抽象工厂&#xff0c;工厂方法的区别&#xff0c;UML类图&#xff0c;应用场景类和类的关系以及关系的强弱耦合度由弱到强的是关联关系&#xff1a;聚合关系&#xff1a;组合(Composition) 关系&#xff1a;类关系的总结类图UML说明-- -- -- -- -- -- ---&…...

恐怖小说网站怎么做/池州网站seo

技术背景 笔者在执行一个Jax的任务中&#xff0c;又发现了一个奇怪的问题&#xff0c;就是明明只分配了很小的矩阵空间&#xff0c;但是在多次的任务执行之后&#xff0c;显存突然就爆了。而且此时已经按照Jax的官方说明配置了 XLA_PYTHON_CLIENT_PREALLOCATE 这个参数为 fals…...

免费英文建设网站/广州seo优化排名推广

前言 前面介绍完了队列&#xff08;包括双端队列&#xff09;&#xff0c;今天探讨以下Java并发包中一个List的并发数据结构实现CopyOnWriteArrayList&#xff0c;顾名思义CopyOnWriteArrayList也是一种基于数组的类似ArrayList的集合&#xff0c;CopyOnWriteArrayList比起Arra…...

网站商业授权/5188关键词挖掘工具

作者&#xff1a;何海涛 出处&#xff1a;http://zhedahht.blog.163.com/ 题目&#xff1a;定义Fibonacci数列如下&#xff1a; / 0 n0 f(n) 1 n1 \ f(n-1)f(n-2) n2 输入n&#xff0c;用最快的方法求该数…...

上海网站建设基础/网站运营主要做什么工作

●一份文档就是一棵节点树。●节点分为不同的类型&#xff1a;元素节点、属性节点和文本节点等。●getElementById()方法将返回一个对象&#xff0c;该对象对应着文档里的一个特定的元素节点。●getElementsByTagName()方法将返回一个对象数组&#xff0c;它们分别对应着文档里…...