C语言——字符函数和字符串函数(三)【strtok,strerror,perror】

📝前言:
上一篇文章C语言——字符函数和字符串函数(二)对字符函数和字符串函数strstrstrcmp和strncmp进行了一定的讲解
这篇文章主要讲解以下函数的用法:
1,strtok
2,strerror
3,perror

🎬个人简介:努力学习ing
📋个人专栏:C语言入门基础
🎀CSDN主页 愚润求学
🌄每日鸡汤:知不足而奋进,望远山而前行


文章目录

  • 一,strtok的使用
    • 1,strtok初步了解
    • 2,注意事项
    • 3,返回值的不同情况
      • (1)strtok的参数1不为NULL
      • (2)strtok的参数1为NULL
      • (3)字符串中不存在更多标记
  • 二,strerror的使用
  • 三,perror的使用

一,strtok的使用

1,strtok初步了解

我们先来看一下官网对它的介绍👇🏻
在这里插入图片描述
提取出它的函数原型:char * strtok ( char * str, const char * delimiters );
①我们先分别理解这里面的参数返回类型
●参数1:str是需要分割的字符串
●参数2:delimiters是用来分割的分割符的集合
●返回:返回一个指针(下面会讲解具体的返回情况)

strtok的功能是:根据delimiters里面的分隔字符,把 str分割成不同的标记(这些标记是由分隔符中的任何字符分隔的连续字符序列。)
可能有点抽象,下面我举个例子:

比如我们要分割“zhangsan@163.com”这一个字符串
请看下面的代码👇🏻

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "zhangsan@163.com";char str[3] = { '.','@'};printf("%s", strtok(arr, str));return 0;
}

这里面arr是我们分割的字符串,str是分隔字符的集合
正常流程就是:用str中的分隔字符,把arr分成:zhangsan,163,com这几个标记

但是当我们运行,输出结果👇🏻
在这里插入图片描述
(通过这个结果我们可以猜测:printf应该是从z这个首地址开始打印,但是打印完zhangsan就停止了)
是不是这样呢?(当我们了解了strtok的返回和注意事项就会理解)👇🏻

2,注意事项

strtok函数在找到str中的下一个标记的时候,会将标记用‘\0’结尾(即可能会替换掉这个标记结尾的分隔符)
请看👇🏻
在这里插入图片描述
显而易见,当这一次strtok被调用后,找到了第一个标记zhangsan,然后把张三后面的@换成了\0
总之,strtok函数会改变被操作的字符串,因此在我们使用strtok分割字符串时,可以先把字符串拷贝一份,对拷贝的那一份进行操作,这样就不会造成原来的字符串丢失。

3,返回值的不同情况

在这里返回情况可以分为三类:
1,strtok的参数1不为NULL
2,strtok的参数1为NULL
3,字符串中不存在更多标记

(1)strtok的参数1不为NULL

这时候函数会找到str中的第一个标记,然后以\0将它结尾,并且记住这个标记结束后的位置,然后返回一个指向这个标记起始位置的指针
继续看上面用到的例子:

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "zhangsan@163.com";char str[3] = { '.','@'};printf("%s", strtok(arr, str));return 0;
}

在这里插入图片描述
在这个例子里,strtok函数返回了zhangsan的起始位置z,随后printfz位置开始打印,遇到了被strtok修改成的\0于是停止了打印

(2)strtok的参数1为NULL

strtok的参数为NULL时,函数就会从同一个字符串中被保留的位置(即上一个标记结束后的位置)开始,查找下一个标记,当找到标记后,依然是:\0将这个标记结尾,并且记住这个标记结束后的位置,然后返回一个指向这个标记起始位置的指针

请看下面的代码,依旧是要实现分割“zhangsan@163.com”这一个字符串👇🏻

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "zhangsan@163.com";char str[3] = { '.','@'};char* ptr = NULL; //用ptr接收返回的指针for (ptr = strtok(arr, str); ptr != NULL; ptr = strtok(NULL, str))          {printf("%s\n", ptr); //用ptr接收的地址打印}//用for循环可以实现第一次传入strtok的arr// 然后传入strtok的都是NULLreturn 0;
}

输出结果:
在这里插入图片描述
arr的变化:
在这里插入图片描述
第一次strtok返回z的地址,且strtok@改成\0ptr接收到了z的地址
第二次strtok返回1的地址,且把.改成\0ptr接收了1的地址
第三次strtok返回c的地址,且把\0改成\0(通俗理解),ptr接收了c的地址
然后根据ptr这些地址分别打印出了这些标记
那第四次,com之后找不到标记了呢?👇🏻

(3)字符串中不存在更多标记

当字符串中不存在更多标记时,函数就会返回NULL指针,这也就是为什么上面的例子中for循环的进入条件是:ptr != NULL

二,strerror的使用

头文件:<errno.h>
strerror是一个传入错误码作为参数返回参数部分错误码对应的错误信息的字符串地址的函数

先简单了解什么是错误码:
C语言程序启动的时候,如果程序出现问题,会返回一个错误码,这个错误码会被记录到errno这个全局变量中
不同的错误码都对应着不同的错误信息

使用展示👇🏻

#include <stdio.h>  
#include <errno.h>  
#include <string.h>  int main() {FILE* file = fopen("nonexistent_file.txt", "r");if (file == NULL) {printf("Error opening file: %s\n", strerror(errno));return 1; // 返回错误码  }// ...其他代码...  fclose(file);return 0; // 返回0表示成功  
}

输出结果:
在这里插入图片描述

在这个例子中,如果文件打开失败,fopen函数会返回NULL,并且errno会记录一个表示具体错误的值。
我们使用strerror函数就可以得到错误码对应的错误信息的地址,然后打印出来。

三,perror的使用

perror函数也是一个用来打印错误码的函数
通过接受一个字符串作为参数,并把它作为错误消息输出到标准错误流
同样是上面的代码,我们修改一下,用perror👇🏻

#include <stdio.h>  
#include <errno.h>  
#include <string.h>  int main() {  FILE *file = fopen("nonexistent_file.txt", "r");  if (file == NULL) {  perror("Error opening file");  return 1; // 返回错误码  }  // ...其他代码...  fclose(file);  return 0; // 返回0表示成功  
}

在这里插入图片描述
输出结果是完全一样的,perror的不同就在于,它打印完参数部分的字符串后,在打印一个:和一个 (空格),接着打印错误信息。


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

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

相关文章

XPM_CDC_SINGLE(UG974)

Parameterized Macro: Single-bit Synchronizer&#xff08;参数化宏&#xff1a;单比特同步器&#xff09; MACRO_GROUP: XPMMACRO_SUBGROUP: XPM_CDCFamilies: UltraScale, UltraScale 1、 Introduction&#xff08;介绍&#xff09; 此宏将一个一位信号从源时钟域同步到目…

[音视频]H264码流分析工具

[音视频]H264码流分析工具 CTI-TS EasyICE Elecardstreameyetools VideoEye H264VideoESViewer 学习H264码流&#xff0c;H264码流进行分析 http://blog.csdn.net/leixiaohua1020/article/details/17933821 H264BSAnalyzer https://github.com/latelee/H264BSAnalyzer.g…

Linux上iPortal 配置80端口的http

作者&#xff1a;yx 文章目录 前言方法一、配置使用外置ES1、关闭启用 iPortal 内置的 ES2、修改80端口3、启动外置ES4、启动iPortal5、结果验证 方法二、更改 Linux 系统配置1. 安装 Authbind2. 启用端口的读取和执行权限3. 在 Apache Tomcat 上启用 Authbind4. 重启iPortal5.…

FME软件安装教程及问题解决

FME软件 FME(Feature Manipulate Engine,简称FME)是加拿大Safe Software公司开发的空间数据转换处理系统,它是完整的空间ETL解决方案。该方案基于OpenGIS组织提出的新的数据转换理念“语义转换”,通过提供在转换过程中重构数据的功能,实现了超过250种不同空间数据格式(模型)之…

云HIS源码 云HIS解决方案 支持医保功能

云HIS系统重建统一的信息架构体系&#xff0c;重构管理服务流程&#xff0c;重造病人服务环境&#xff0c;向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS作为基于云计算的B/S构架的HIS系统&#xff0c;为基层医疗机构&#xff08;包括诊所、社区卫生服务中心、乡镇卫…

三叠云协同型SRM,供应链管理的卓越之道

目前全球供应链在向着不断延伸和复杂化的趋势发展&#xff0c;企业采购管理面临着前所未有的挑战。想要在竞争激烈的市场中立足&#xff0c;仅仅考虑自身的生产效率&#xff0c;而忽视与供应商的协同工作&#xff0c;是难以跨越成功的。企业的命脉不仅依赖于技术、创新&#xf…

ATFX汇市:美国核心PCE数据连续四个月下降,最新值已低至3.2%

ATFX动态&#xff1a;据美国商务部数据&#xff0c;美国11月核心PCE物价指数年率3.2%&#xff0c;低于前值3.4%&#xff0c;连续四个月下降&#xff1b;美国11月核心PCE物价指数月率0.1%&#xff0c;与前值持平&#xff0c;略低于预期值0.2%。数据发布后&#xff0c;美元指数五…

Mybatis三 | 动态SQL

目录 if where set ctrl alt l格式化SQL语句 随着用户的输入或外部条件的变化而变化的SQL称为动态SQL if <if>用来判断条件是否成立&#xff0c;使用test属性进行条件判断&#xff0c;如果true&#xff0c;则拼接SQL where wehre元素只会在有条件成立的情况下才插入…

基础js逆向练习-登录密码破解(js逆向)

练习平台&#xff1a;逆向账号密码 https://login1.scrape.center/ 直接打开平台&#xff0c;输入密码账号&#xff0c;抓包找到加密的参数携带的位置&#xff0c;这边我们找到的是一个叫token的加密参数&#xff0c;这个参数的携带是一个密文 我们首先考虑一下搜索这个加密的…

小学教师职称评定条件

作为一名小学教师&#xff0c;职称评定是职业生涯中不可避免的一环。那么&#xff0c;小学教师职称评定的条件是什么呢&#xff1f;今天&#xff0c;我们就来一起探讨一下这个话题。 小学教师职称评定与学历、教龄、教育教学能力等多方面因素有关。具体来说&#xff0c;小学教师…

大数据机器学习深入Scikit-learn:掌握Python最强大的机器学习库

文章目录 大数据机器学习深入Scikit-learn&#xff1a;掌握Python最强大的机器学习库引言机器学习与Scikit-learn的重要性Scikit-learn的基本概述 安装和配置如何安装Scikit-learn安装必要的依赖库 Scikit-learn的主要特性强大的预处理功能众多的机器学习算法效果评估和模型选择…

Java深浅拷贝

文章目录 目录 文章目录 前言 1) 引用拷贝 2) 对象拷贝 二 . 浅拷贝 1) 拷贝构造方法实现浅拷贝 2) 工厂方法实现浅拷贝 3) clone方法实现浅拷贝 三 . 深拷贝 1) 通过重写clone方法来实现深拷贝 2) 通过对象序列化实现深拷贝 前言 大家好,今天给大家带来的是java中的…