字符函数和内存函数(二)

news/2024/4/29 3:44:29/文章来源:https://blog.csdn.net/2301_76207836/article/details/131687816

目录

一、strtok函数

二、strerror函数

三、memcpy函数

3.1memcpy函数的认识

3.2memcpy函数的模拟实现

四、memmove函数

4.1memmove函数的认识

4.2memmove函数的模拟实现

五、memcmp函数

5.1memcmp函数的认识

 5.2memcmp函数的模拟实现

 六、memset函数

 七、字符分类函数

八、字符转换函数


一、strtok函数

 strtok函数函数的功能:将字符串拆分为标记

strtok函数的使用:
 

int main()
{char* p = "23545362421@qq.com";const char* sep = ".@";char arr[30];char* str = NULL;strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}
}

注意:

  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置
  •  strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
  • 如果字符串中不存在更多的标记,则返回 NULL 指针

二、strerror函数

 strerror函数的功能:返回错误码,所对应的错误信息

使用strerror函数要引头文件

       #include  <erron.h>

strerror函数的使用:

int main()
{FILE* pf = fopen("date.txt", "r");if (pf == NULL){//printf("%s\n", strerror(errno));perror("fopen")return 1;}return 0;
}

报错的是程序运行过程中的运行的错误 

三、memcpy函数

3.1memcpy函数的认识

 memcpy函数的功能:将字节数的值从指向的位置直接复制到目标指向的内存块

注意:

  • 这个函数在遇到 '\0' 的时候并不会停下来
  • 如果source和destination有任何的重叠,复制的结果都是未定义的

使用memcpy函数要引头文件

        #include <string.h> 

 memcpy函数的使用

int main()
{int arr1[5] = { 0 };int arr2[] = { 1,2,3 };memcpy(arr1, arr2, 12);int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr1[i]);}
}

 

可以拷贝整型,也可以拷贝浮点型,所以用void*来接收 

memcpy函数是用来处理不重叠的内存拷贝的 

3.2memcpy函数的模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h> void* my_memcpy(void* dest, const void* src, int num)
{assert(dest && src);void* ret = dest;while (num--){*(char*)dest =  *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr1[5] = { 0 };int arr2[] = { 1,2,3 };my_memcpy(arr1, arr2, 12);int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr1[i]);}
}

注意:强制类型转化是临时的 

四、memmove函数

4.1memmove函数的认识

memmove函数的功能:将字节数的值从源指向的位置复制到目标指向的内存块。允许目标和源重叠。

注意:

为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数

如果源空间和目标空间出现重叠,就得使用memmove函数处理

使用memmove函数要引头文件

        #include <string.h> 

memmove函数的使用

int main()
{int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

4.2memmove函数的模拟实现

这样拷贝下去和我们想要的结果不同,所以我们就从后向前拷贝 

src在dest前面时:后-->前

 src在dest后面时:前-->后

#include <stdio.h>
#include <string.h>
#include <assert.h> void* my_memmove(void* dest, const void* src, int num)
{assert(dest && src);char* ret = dest;if (dest < src){//前->后while (num--){	*(char*)dest =  *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{//后->前while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret; 
}int main()
{int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };my_memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

五、memcmp函数

5.1memcmp函数的认识

memcmp函数的功能:比较从ptr1和ptr2指针开始的num个字节

使用memcmp函数要引头文件

        #include <string.h> 

memcmp函数的使用:

int main()
{int arr1[] = { 1,2,1,5,4 };int arr2[] = { 1,2,257 };int ret = memcmp(arr1, arr2, 9);printf("%d\n", ret);return 0;
}

 

 两个数组的前九个字节是都是相同的,,所以返回0

 5.2memcmp函数的模拟实现

#include <stdio.h>
#include <string.h>
#include <assert.h>int my_memcmp(const void* s1, const void* s2, int num)
{assert(s1 && s2);char* str1 = (char*)s1;char* str2 = (char*)s2;int i = 0;for (i = 0; i < num; i++){if (*(str1 + i) != *(str2 + i)){return (*(str1 + i) - *(str2 + i));}}return 0;
}int main()
{int arr1[] = { 1,2,3,5,4 };int arr2[] = { 1,2,257 };int ret = my_memcmp(arr1, arr2, 9);printf("%d\n", ret);return 0;
}

 六、memset函数

memset函数的功能:把ptr指向的前num个字节设置为value值 

使用memcset函数要引头文件

        #include <string.h> 

memset函数的使用:

int main()
{char arr[] = "hello word";memset(arr, 'x', 5);printf("%s\n", arr);return 0;
}

注意:

  • 要设置的值。该值作为 int 传递,但该函数使用此值的无符号char转换填充内存块 
  • 以字节为单位来设置

将数组每个元素变为1是做不到的  

 七、字符分类函数

使用字符判断函数要引头文件

        #include <ctype.h>

判断为真返回非0的数,判断为假返回0 

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v'
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

八、字符转换函数

int tolower ( int c );        大写--->小写

int toupper ( int c );        小写--->大写

int main()
{char str[20] = { 0 };gets(str);char* p = str;while (*p){if (isupper(*p))*p = tolower(*p);p++;}printf("%s\n", str);return 0;
}

本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者的支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。 

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

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

相关文章

PyCharm 自动添加作者信息、创建时间等信息

PyCharm 自动添加作者信息、创建时间等信息‘ 第一步 找到settings 第二步&#xff0c;找到下图所示位置输入下面代码&#xff0c;作者改成你自己的缩写&#xff0c;你也可以添加其他的 Project &#xff1a;${PROJECT_NAME} File &#xff1a;${NAME}.py IDE &…

【技能实训】DMS数据挖掘项目-Day09

文章目录 任务9【任务9.1.1】升级DataBase类为可序列化的类&#xff0c;以便在文件保存或网络中传递【任务9.1.2】升级LogRec类为可序列化的类&#xff0c;以便在文件保存或网络中传递【任务9.1.3】升级MatchedLogRec类为可序列化的类&#xff0c;以便在文件保存或网络中传递【…

StringBuffer类 StringBuilder 类

StringBuffer类 介绍 StringBuffer是一个容器&#xff0c;代表可变的字符序列&#xff0c;可以对字符串内容进行增删。 StringBuffer是可变长度的。 实现了序列化接口&#xff0c;可实现串行化&#xff08;可以将内容保存至文件或者网络传输&#xff09;&#xff1a; Serial…

关于Java的网络编程

网络的一些了解 网络通信协议 链路层&#xff1a;链路层是用于定义物理传输通道&#xff0c;通常是对某些网络连接设备的驱动协议&#xff0c;例如针对光纤、网线提供的驱动。网络层&#xff1a;网络层是整个TCP/IP协议的核心&#xff0c;它主要用于将传输的数据进行分组&…

华为申请注册盘古大模型商标;京东推出言犀大模型,率先布局产业应用

7月14日科技新闻早知道&#xff0c;一分钟速览。 1.华为申请注册盘古大模型商标&#xff1a; 据天眼查 App 显示&#xff0c;7 月 7 日&#xff0c;华为技术有限公司申请注册“华为云盘古”、“Huawei Cloud Pangu Models”文字及图形商标&#xff0c;国际分类为网站服务、社…

文心一言 VS 讯飞星火 VS chatgpt (59)-- 算法导论6.4 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;59&#xff09;-- 算法导论6.4 3题 三、对于一个按升序排列的包含 n 个元素的有序数组 A 来说&#xff0c;HEAPSORT 的时间复杂度是多少?如果 A 是降序呢? 文心一言&#xff1a; 对于一个按升序排列的包含 n 个元素的有序数组…

C++图形开发(14):游戏完善——无限空中起跳解决

文章目录 1.问题描述2.如何解决&#xff1f;3.整段代码 1.问题描述 在游玩过程中&#xff0c;我们肯定发现了之前所给出的游戏源码中的一个小bug&#xff1a; 小球可以空中无限起跳&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&…

【Linux操作系统】多线程抢票逻辑——学习互斥量(锁)函数接口

文章目录 1.进程线程间的互斥相关背景概念2.联系代码学习同步互斥问题3.互斥量&#xff08;锁&#xff09;的函数接口3.1初始化互斥量3.2销毁互斥量3.3互斥量加锁和解锁3.4改进多线程抢票代码 1.进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫…

在UI中使用SpriteMask裁减任意shader的粒子效果

前言 由于我们需要在Mask中对粒子效果进行裁减。但是我们的的特效同事不愿意每个shader都去添加Stencil。所以使用SpriteMask方式进行裁减。 使用步骤 1. 添加SpriteMask Component 更具你需要的Mask形状设置精灵图片。又因为实际是精灵&#xff0c;并不属于UI系统&#xff…

静态库 的制作与使用

文章目录 重要命令程序组成静态库制作流程静态库的使用 gcc main.c -o APP -I(i) 头文件路径 -l(L) 库名字&#xff08;xxx) -L 库路径 重要命令 gcc -o -I(大写i) -l(小写L) -L cp&#xff1a;复制文件 -r 递归&#xff0c;用于复制文件夹所有文件 mv&#xff1a;移动文件 程…

【ArcGIS Pro二次开发】(46):要素类从上到下、从左到右排序

要素类经过编辑之后&#xff0c;【OBJECTID】字段会变得不规律。应部分网友要求&#xff0c;做了这个从上到下、从左到右排序的工具。 不过后来在ArcGIS Pro中发现了一个【排序】工具&#xff0c;已经可以完美实现这个功能需求&#xff0c;发现自己做了个白工。 不过做了不能白…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览&#xff1a; rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定&#xff1a; 分开的范围之间可用逗号隔开&#xff0c;最后再用一个小括号括起来。F4可以快速锁定行和列。…

20230714----重返学习-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性

day-112-one-hundred-and-twelve-20230714-DOM-diff算法-构建工具-包管理工具-Vite基本使用-Vue3新特性 DOM-diff算法 vue2中diff算法 同级比对&#xff0c;跨级比对性能差。而且采用的方式是递归比对&#xff0c;更差一点。根节点只能有一个&#xff0c;比对的时候会从根节…

MySql5.6版本开启慢SQL功能

文章目录 1引言1.1目的1.2注意点说明1.3 操作步骤1.3.1 临时生效操作步骤1.3.2 永久生效操作步骤1.3.3 按日期生成日志文件1.3.4 执行成功后验证功能是否开启 1.4 慢SQL日志记录内容介绍1.5 Shell脚本 1引言 1.1目的 开启 MySQL 的慢查询日志&#xff08;Slow Query Log&…

【Distributed】分布式Ceph存储系统

文章目录 一、存储基础1. 单机存储设备1.1 DAS1.2 NAS1.3 SAN1.4 单机存储的问题1.5 商业存储解决方案 2. 分布式存储&#xff08;软件定义的存储 SDS &#xff09;分布式存储的类型 3. Ceph 简介4. Ceph 优势5. Ceph 架构6. Ceph 核心组件7. OSD 存储后端7.1 Filestore7.2 Blu…

微服务架构+创建微服务工程(商品/订单)

目录 1.微服务架构 1.1.单体应用架构 1.2.微服务应用 1.3 微服务架构的优势 1.4.微服务架构的缺点(挑战) 1.5. SpringCloud与微服务关系 1.6.SpringBoot和SpringCloud关系 2. 创建微服务工程 2.1.数据库 2.2.搭建父工程 2.2 创建公共模块 2.3.商品系统 2.4.订单微…

在Linux中使用curl访问EasyCVR页面,返回报错Unauthorized是什么原因?

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比如&#xff1a;视…

检测到错误页面web应用服务器版本信息泄露

详细描述 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露&#xff0c;攻击者收集到服务器信息后可进行进一步针对性攻击。 解决办法 临时修复建议如下&#xff1a; 1、关闭web服务器错误提示。 2、关闭运行平台的错误提示。 3、建立错误机制&#xff0c;不要把真实…

力扣 198.打家劫舍【中等】

198.打家劫舍 1 题目2 思路3 代码4 结果 1 题目 题目来源&#xff1a;力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/house-robber 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃…

优化产品知识库的 SEO 技巧

在当今数字化的商业环境中&#xff0c;为产品知识库进行搜索引擎优化&#xff08;SEO&#xff09;是至关重要的。随着用户越来越倾向于通过搜索引擎获取信息&#xff0c;优化产品知识库可以帮助你的企业在竞争激烈的市场中脱颖而出。 通过改进SEO&#xff0c;你可以帮助用户找到…