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.mzph.cn/news/580265.shtml

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

相关文章

Linux下的文本编辑Vi/Vim

编辑文件 文本编辑器有很多&#xff0c;比如图形模式的gedit、OpenOffice 等&#xff0c;文本模式下的编辑器有vi、vim&#xff08;vi的增强 版本&#xff09;等。vi和vim是我们在Linux中最常用的编辑器。 gedit 类似于Windows下的记事本&#xff0c;很方便的去修改文本。 Op…

深入了解云原生:定义与特征解析

文章目录 一、云原生概述1.1 什么是云原生1.2 云原生组成要素1.3 补充资料 二、云原生的目标2.1 云原生关键目标2.2 云原生特性 三、云原生应用 VS 传统单体应用参考资料 一、云原生概述 1.1 什么是云原生 (1)云原生定义 云原生(Cloud Native) 是一种软件架构和开发方法论&a…

山西电力市场日前价格预测【2023-12-27】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-27&#xff09;山西电力市场全天平均日前电价为737.42元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在08:00~08:30。最低日前电价为313.03元/MWh&#xff…

Qt Creator可视化交互界面exe快速入门3

上一期介绍的通过Qt Creator的组件直接拖拽的方式完成了一个界面&#xff0c;这期介绍按钮的信号交互。 专有名称叫信号与槽 实现方法1&#xff1a; 鼠标右键选择转化为槽就会跳出这样的界面 选择第一个为单击信号。然后就会跳转到代码界面。多了on_pushButton_clicked()。 …

分页合理化是什么?

一、前言 只要是干过后台系统的同学应该都做过分页查询吧&#xff0c;前端发送带有页码&#xff08;pageNum&#xff09;和每页显示数量&#xff08;pageSize&#xff09;的请求&#xff0c;后端根据这些参数来提取并返回相应的数据集。在SpringBoot框架中&#xff0c;经常会使…

以社区为基石,IvorySQL逐步成为中国基础软件开源数据库产业重要一员

编者按&#xff1a;开源数据库技术&#xff0c;作为软件开发领域的一大趋势&#xff0c;正逐渐改变整个软件产业的面貌。在这个充满活力的领域中&#xff0c;瀚高股份的IvorySQL凭借其社区活跃度和影响力&#xff0c;已经成为中国基础软件开源数据库产业的重要一员。随着《2023…

TCP:IP原理

TCP/IP 原理 TCP/IP 协议不是 TCP 和 IP 这两个协议的合称&#xff0c;而是指因特网整个 TCP/IP 协议族。从协议分层模型方面来讲&#xff0c;TCP/IP 由四个层次组成&#xff1a;网络接口层、网络层、传输层、应用层。 网络访问层(Network Access Layer) 网络访问层(Network …

宏集方案 | 物联网HMI的关键驱动力—SCADA级功能库和控件库

来源&#xff1a;宏集科技 工业物联网 宏集方案 | 物联网HMI的关键驱动力—SCADA级功能库和控件库 原文链接&#xff1a;https://mp.weixin.qq.com/s/UEPtpTehdbFrw3MUCnuR2A 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 01 前言 在这个数字化时代&#xff0c;物…

Java内存区域与内存溢出异常

Java与C++之间有一堵由内存分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 2.1 概述 对于从事C、C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的“皇帝”,又是从事最基础工作的劳动人民——即拥有每一个对象的“所有权”,又…

个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

vscode中默认shell选择

terminal.integrated.defaultProfile.linux在vs的Preference的Settings里面搜索terminal.integrated.defaultProfile.linux&#xff0c;默认的应该是null&#xff0c;将其修改为bash即可。 linux———/bin/sh、 /bin/bash、 /bin/dash的区别

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是 TroubleShooting 竞赛&#xff0c;对应的分别为亚马逊云科技 GameDay 和亚马逊云科技 Jam&#xff0c;想必…

数据结构:图文详解 树与二叉树(树与二叉树的概念和性质,存储,遍历)

目录 一.树的概念 二.树中重要的概念 三.二叉树的概念 满二叉树 完全二叉树 四.二叉树的性质 五.二叉树的存储 六.二叉树的遍历 前序遍历 中序遍历 后序遍历 一.树的概念 树是一种非线性数据结构&#xff0c;它由节点和边组成。树的每个节点可以有零个或多个子节点…

【Linux基础】5. 磁盘管理

文章目录 【 1. 查看磁盘空间 】1.1 df 查看空间利用大小1.2 du 查看目录所占空间大小 【 2. 打包、压缩 】2.1 tar -cvf 打包2.2 gzip 压缩 【 3. 解压缩、解包 】3.1 gunzip 解压缩3.2 tar -xvf 解包 【 1. 查看磁盘空间 】 1.1 df 查看空间利用大小 作用 查看整个文件系统…

5G阅信应用场景有哪些?

5G阅信的应用场景非常广泛&#xff0c;以下是一些常见的应用场景&#xff1a; 1.工业自动化&#xff1a;5G阅信可以连接各种工业设备和传感器&#xff0c;实现设备之间的实时通信和控制&#xff0c;提高生产效率和自动化水平。 2.物联网和智能家居&#xff1a;5G阅信可以连接各…

2014年第三届数学建模国际赛小美赛B题全地形伪装解题全过程文档及程序

2014年第三届数学建模国际赛小美赛 B题 全地形伪装 原题再现&#xff1a; 破坏性着色在军事用途中很常见&#xff0c;用于军用车辆、士兵制服和装备。视觉是人类的主要方向感&#xff0c;伪装的主要功能是欺骗人眼。军事服装中存在大量的伪装图案&#xff0c;以适应作战服装与…

时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-BiLSTM麻雀算…

分享好用的chatgpt

1.在vscode中&#xff0c;点击这个&#xff1a; 2.搜索&#xff1a;ChatGPT - 中文版&#xff0c;个人觉得这个更好用&#xff1a; 3.下载完成之后&#xff0c;左侧会多出来这个&#xff1a; 点击这个图标就能进入chatgpt界面了 4.如果想使用tizi访问国外的chatgpt&#xf…

【c++】入门1

c关键字 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff…

【Azure 架构师学习笔记】- Power Platform(1) - 简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Power Platform】系列。 Power Platform 它是一个SaaS平台&#xff0c;支持和延伸M365&#xff0c; Dynamics 365和Azure甚至其他第三方服务。主要提供低代码&#xff0c;自动化&#xff0c;数据驱动和定制化业务逻辑的服务…