C语言——字符串函数(2)和内存函数

news/2025/4/2 15:28:48/

(一)strtok函数

dilimiters参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。如果字符串中不存在更多的标记,则返回 NULL 指针。

strtok函数的应用

如果分隔符太多,难道我们要一直写下去吗?不防我们换一种写法,特别巧妙!

常巧妙!

(二)strerror函数

返回错误码,所对应的错误信息。

错误码翻译成错误信息。

但在我们路径底下没有相应文件,自然是打开失败,所以会报错误信息。

当我在对应路径底下创建了对应文件

当我打开还是错误的,为什么呢?

因为我们还没有把文件名扩展开,一般电脑文件后缀名都是隐藏着的,那怎么打开呢?

当我们打开文件扩展名才会显示文件名所有后缀。

这次就不会报什么错误信息了,说明对应路径底下存在文件,我们打开了文件并关闭了。

还有个与它类型类似的函数perror

它会自动在后面打出错误信息。

perror==printf strerror

(三)memcpy函数

https://legacy.cplusplus.com/reference/cstring/memcpy/?kw=memcpy

函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

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

如果source和destination有任何的重叠,复制的结果都是未定义的。

memcpy函数的返回类型是void*指针,因为memcpy设计者,不知道程序员使用memcpy拷贝什么类型的的数据,void*指针——通用类型指针,可以接受任意类型数据的地址。但是:这种类型指针不能直接解引用加减运算!

memcpy模拟实现函数

dest=(char*)dest+1 可以写出((char*)dest)++吗? src=(char*)src+1 可能可以但会出错。

但结果怎么跟我们的预想不一样呢?

(四)memmove函数

https://legacy.cplusplus.com/reference/cstring/memmove/?kw=memmove

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

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

memmove模拟实现函数

换种测试方法

因为数组的地址是从低地址到高地址存放的,所以我们将目的地指针与源头指针比较,就能实现从前->后 或者从后->前的交换方式,分成区间来解决,完美模拟了memmove函数的实现。

(五)memcmp函数

跟strcmp的返回值相似。

那如果我们比较17个字节谁大呢?

明显arr2大,为什么呢?

因为VS是小端存储模式

arr1内存存储是 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00

arr2内存存储是 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 06 00 00 00

第17个字节是05与06的比较,自然arr2大,所以返回-1。

(六)memset函数

memset函数在修改的时候是以字节单位修改的。

所以给数组初始化是一个一个字节初始化,40字节就是10个010101。不能用来初始化数组。


http://www.ppmy.cn/news/35281.html

相关文章

优秀程序员的5个特征,你在第几层?

每个人程序员都对未来的职业发展有着憧憬和规划,要做架构师、要做技术总监、要做CTO。但现实总是复杂的,日复一日的工作与生活总能让人一次又一次地陷入迷茫。大部分原因就是对职业发展轨迹和自我能力提升的一般规律缺乏认识,做事找不到方向或…

【多线程】创建线程有哪几种方式

目录1.继承Thread类2.实现Runnable接口3.实现Callable接口4.利用线程池1.继承Thread类 1.定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体2.创建Thread子类的实例,即创建了线程对象3.调用线程对象的start()方法来启动…

eNSP 网络地址转换配置实验

关于本实验当使用私有IP地址的内部主机访问外网时,需要使用NAT将其私有IP地址转换为公有IP地址,此时需要在网关路由器上配置NAT来提供相应的地址转换服务。当网关路由器连接ISP的接口上未使用固定IP地址,而是动态地从ISP获取IP地址时&#xf…

Linux Debian11使用podman安装sqli-labs靶场环境

一、Sqli-labs简介 Sqli-labs是一个可以用来学习SQL注入的游戏教程,学习渗透可以借用这个工具来入门学习SQL注入的一些理论知识。 二、安装podman环境 Linux Debian11使用国内源安装Podman环境 三、podman安装sqli-labs靶场环境 1.podman搜索sqli-labs镜像 打…

大数加法【算法解析、代码模板、思路简单清晰】

791. 高精度加法 - AcWing题库 算法解析 大数加法其实本质上就是模拟 小学我们学的加法运算 分治 的思想 我们将一个很大的数字,拆成一个数的加法——分治思想 如何存储 如果对于一个真正很大的数字来说,可能long long都不支持(最多支持19…

Nginx入门讲解

Nginx入门讲解 Nginx Web服务介绍 nginx是个高性能的http和反向代理服务器: IMAP/POP3/SMTP服务器nginx性能稳定、性能强大、非常节约系统资源Nginx是高性能、轻量级的服务器;越来越多的企业使用nginx来代替Apache; nginx使用越来越广泛&…

JNI原理及常用方法概述

1.1 JNI(Java Native Interface) 提供一种Java字节码调用C/C的解决方案,JNI描述的是一种技术。 1.2 NDK(Native Development Kit) Android NDK 是一组允许您将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具,NDK描述的是工具集…

文本三剑客之sed编辑器

文本三剑客:都是按行读取后处理。 grep 过滤行内容。awk 过滤字段。sed 过滤行内容;修改行内容。sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中…