字符串函数(4)--strtok函数和strerror函数

news2024/11/18 21:28:38

1.strtok函数 — 分割字符串函数

2.strerror函数 — 错误报告函数

1.strstok函数的用法

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

直接看函数的声明:
参数1:要切割的地址,参数2:切割时的标记物

注意:strtok函数本身会记住第一次传过来的这个地址,第一次传过来时:如果这个地址为空,则strtok函数返回一个空指针,如果这个地址不为空,则返回传过来的首地址。

由于这个函数的第二个参数为要切割的标记物,假如这个标记物不存在,返回的也是第一次传进来的要切割的函数的首地址。

下面举例说明:

int main()
{
	char arr[] = "abcd@.dde.agc";
  //192.168.31.121
	//ip地址:点分十进制的表示方式
	char* p = "--";  // 标记物
	char* ret = NULL;
	for (ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
	{	//这个函数自己会识别上一次标记的位置
		printf("%s\n",ret);
	}

}

在这里插入图片描述

找不到标记物,返回的是字符串的首地址。
那要是找到了标记物呢?
打印出来的结果是这样的:
在这里插入图片描述
调试后发现:

在这里插入图片描述
第一次切割时,标记物的位置被改成了 ‘\0’
你可能会问,在循环内部,为什么 是 ret = strtok (NULL,p) 呢?传递的不应该是arr吗,
是的,传递的确实不是arr,而是 NULL,为什么呢?

是因为strtok函数内部,在第一次接收到字符串的地址后,当它切割成功时,会自己记住这个切割点的位置,下一次调用这个函数时,它会记住这个位置并且从该位置的下一个位置开始寻找切割物。

这就是为什么第二次及以后调用strtok函数时,传递的第一个参数是NULL的原因。

当我们进行第二次切割时,会发现一个奇怪的问题:
为什么第二次切割没有将第一个@后的 . 改成 ‘\0’ ?,而是在之后的 . 改成 ‘\0’ 呢?
如下图:
在这里插入图片描述

进一步探讨后发现:

在这里插入图片描述

当第一次切割成功后,第二次切割时,我们知道,这个函数会记住上一次切割点并从下一个位置开始寻找切割点,然而,当这所谓的下一个位置,是切割点时,这个函数直接不理,不改成 ‘\0’,直接跳过继续寻找,知道找到的字符不是切割标记字符时,从这以后,才开始真正意义上的找切割点,并更改为 \0

也就是说,第一次切割成功后,abcd@.@@中的第一个@,被改成了 ‘\0’,第二次调用该函数时, .@@不会被改成 ‘\0’,而是直接跳过,继续寻找,知道找到不是切割物的字符。
看到这里,你应该明白了strtok函数的使用方法。

2.strerror函数的使用方法

strerror–错误报告函数,它会返回错误码,所对应的错误信息

  错误码  错误信息
	0		No error
	1		Operation not permitted
	2		No such file or directory

	errno : 是一个全局的错误码的变量
当c语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errmo中

举例:

int main()
{
	FILE* fp = fopen("text.txt", "r");
	if (fp == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	else
	{
		printf("open file successfully\n");
	}
}

当我们打开文件时,由于电脑中没有这个文件,故会返回错误报告:
在这里插入图片描述
将errno放在strerror中,是为了将该错误码所对应的错误信息放到strerror中,以便返回来打印。

该函数的使用方法就这么简单,一般是配合打开文件等操作使用。

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

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

相关文章

单链表的python实现

首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构。 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存储结构或…

Nginx安装配置及vue项目部署【Centos7】

Background 网上好多都是源码安装,各种编译环境安装配置,感觉太麻烦了,这里直接下载一个rpm包就行了,离线安装也方便。 1、nginx rpm包下载 选择你要使用的版本下载。 nginx官方下载地址:http://nginx.org/packages/ce…

垃圾回收机制

1.什么场景下该使用什么垃圾回收策略? (1).对内存要求苛刻的场景 想办法提高对象的回收效率,尽可能的多回收一些对象,腾出更多内存 (2).在CPU使用率较高的情况下 降低高并发时垃圾回收频率,让CPU更多地去执行业务而不是垃圾回收 …

一文搞懂 Redis 架构演化之路

现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Redis 时,有没有思考过,Redis 到底是如何稳定、高性能地提供服务的? 我使用 Redis 的场景很简单,只使用单机版 Redis 会有什么问…

vite + react +typescript 环境搭建,小白入门级教程

目录前言1. 使用 vite 创建 react 项目1. npm / yarn 命令初始化2. 输入项目名称3. 选择框架4. 选择 Js / Ts5. 项目创建完成6. 启动项目2. 规范项目目录3. 使用 react-router-dom 路由1. 使用 npm / yarn 命令下载2. 更改 react-router-dom 版本1. 通过 npm 命令降低版本2. 手…

rabbitmq基础5——集群节点类型、集群节点基础运维,集群管理命令,API接口工具

文章目录一、集群节点类型1.1 内存节点1.2 磁盘节点二、集群基础运维2.1 剔除单个节点2.1.1 集群正常踢出正常节点2.1.2 服务器异常宕机踢出节点2.1.3 集群正常重置并踢出节点2.2 集群节点版本升级2.3 集群某单节点故障恢复2.3.1 机器硬件故障2.3.2 机器掉电2.3.3 网络故障2.3.…

Android ShapeableImageView使用

ShapeableImageView使用使用 导包 implementation com.google.android.material:material:1.4.0属性 属性描述shapeAppearance样式shapeAppearanceOverlay样式,叠加层strokeWidth描边宽度strokeColor描边颜色 样式 名称属性值描述cornerFamilyrounded圆角cut裁剪…

学习记录-mybatis+vue+elementUi实现品牌查询

和以往不同的是,这一次使用了vue和axios来接收后端传过来的参数,并且新建了impl文件来继承service层的接口。该过程实现一共分为4步骤 步骤一 ①mapper mapper 写mapper接口 其实就是写SQL语句了,第一步就是写SQL。这里使用的是注解开发&…

程序员危机如何化解?

很多人认为程序员一定要干到管理层,才会有继续走下去的希望,而踏实做技术的程序员,只会面临淘汰。事实真是如此吗? △ 截图来源脉脉,如侵删 先不说结论,我们一起先看看网友们的看法: △ 截…

报表控件Stimulsoft v2023.1全新发布 | 附免费下载试用

Stimulsoft Ultimate 宣布发布新版本2023.1!在最新版本中添加了对Razor Pages的支持、新的数据监视器可视化工具、为PHP和Blazor平台更新了组件,欢迎下载试用! Stimulsoft Ultimate官方正版下载 Razor Pages 在 2023.1.1 版中,我们添加了对…

跨域问题以及解决跨域问题的vue-cli解决方案

跨域问题 写项目前要问后端,接口支持跨域吗? 支持就不会出现问题,不支持就需要解决跨域问题 1.如何判断一个浏览器的请求是否跨域? 在A地址(发起请求的页面地址)向B地址(要请求的目标页面地址)发起请求时&#xff…

【JavaEE】多线程(三)线程的状态

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaEE】 ✈️✈️本篇内容:线程的状态,线程安全问题! 🚀🚀代码存放仓库gitee:JavaEE初阶代码存放&a…

抗癌药物之多肽药物偶联物技术(PDC)介绍

长期以来,心血管疾病是全球中年人死亡的主要原因。这种情况最近在高收入国家发生了变化,现在癌症导致的死亡人数是心血管疾病的两倍。2018 年,癌症导致全球 960 万人死亡,1810 万新病例被诊断出来。女性最常发生的癌症是乳腺癌&am…

12Python继承与多态

继承 面向对象三大特性 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中继承 实现代码的重用,相同的代码不需要重复的编写多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 1继承的概念、语法和特点 继承的概…

奖项快报 | ALVA Systems 上榜 《2022 高成长企业 TOP100》!

近日,《2022 高成长企业 TOP 100》榜单发布,凭借卓越的创新能力与在工业 AR 领域的赋能价值,ALVA Systems 在2022年度高成长企业TOP100大赛活动中脱颖而出,成功入选榜单。 *ALVA Systems 入选榜单 创新驱动,赋能数字经…

【ARM -- stm32 汇编代码点亮LED灯】

ARM -- stm32 汇编代码点亮LED灯实现过程查询开发手册分析RCC章节分析GPIO章节编写代码实现过程 查询开发手册 分析RCC章节 一、确定RCC基地址 二、分析RCC_MP_AHB4ENSETR寄存器 1、RCC_MP_AHB4ENSETR寄存器的功能是使能GPIO组相关控制器; 2、RCC_MP_AHB4ENSET…

07第四章:01_常用注解

常用注解 1、Table 作用:建立实体类和数据库表之间的对应关系。 默认规则:实体类类名首字母小写作为表名,如 Employee -> employee 表 用法:在 Table 注解的 name 属性中指定目标数据库的表名; 案例&#xff1…

WPF依赖属性、附加属性、属性继承、类型转换详解

依赖属性 依赖属性回调方法与参数 具有依赖属性的类必须继承自DependencyObject,定义依赖属性要有2个步骤 //1属性包装器,目的是为了向正常属性一样使用依赖属性 public int Name {get { return (int)GetValue(NameProperty); }set { SetValue(NamePr…

国家“数据安全三认证”图解来了

二十大指引新时代新征程。蓝图已经绘就,号角已经吹响,新征程是充满光荣和梦想的远征。二十大报告深刻阐明了实现中华民族伟大复兴的一系列重大问题,系统擘画了以中国式现代化推进民族复兴的宏伟蓝图,是引领中华民族伟大复兴的政治…

论文导读 | GPU上的动态图数据管理技术浅析

一、背景介绍 随着相关技术的发展,图计算与分析系统在大量场景中得到应用。同时,为了解决图规模巨大等因素导致的性能下降问题,研究人员利用GPU这一新型计算硬件,设计了大量高效的图计算与分析解决方案。GPU提供的高并发计算能力…