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的都是NULL
	return 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的不同就在于,它打印完参数部分的字符串后,在打印一个:和一个 (空格),接着打印错误信息。


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

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

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

相关文章

AI工程化与低代码:加速人工智能应用开发的新趋势

随着人工智能&#xff08;AI&#xff09;技术的广泛应用&#xff0c;AI工程化在开发领域中变得越来越重要。而低代码开发平台的出现&#xff0c;进一步加速了AI应用的开发和部署过程。本文将介绍AI工程化的概念&#xff0c;探讨低代码如何助力开发者快速构建和部署AI应用&#…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

WinSCP本地安装部署并结合内网穿透实现远程连接服务器

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默…

知行合一:投资篇

这是一个系列的内容。 是学习。 是沉淀。 是分享。 是反思。 是财务自由的梦想。 已完成&#xff1a; 1.1 编程基础   1.1.1 投资-编程基础-numpy todo… 下面是长期的xmind计划&#xff0c;会根据已经整理的内容逐步完善:

记录 | ubuntu安装nginx

1. 安装依赖 sudo apt-get install libpcre3 libpcre3-devsudo apt-get install zlib1g-devsudo apt-get install openssl libssl-dev 在安装 libssl-dev 的时候若出现报错&#xff1a; 【解决办法】   降级 libssl 解决依赖关系&#xff0c;通过 aptitude 安装&#xff1a;…

【Spring】SpringBoot 配置文件

文章目录 什么是配置文件SpringBoot配置文件配置文件快速入手配置文件的格式properties 配置文件说明properties 基本语法读取配置文件信息properties 配置格式缺点 yml 配置文件说明yml 基本语法使用 yml 连接数据库 yml 使用进阶yml 配置不同数据类型配置对象配置集合配置Map…

构建外卖系统:从技术到实战

在当今高度数字化的社会中&#xff0c;外卖系统的开发变得愈发重要。本文将从技术角度出发&#xff0c;带领读者一步步构建一个基础的外卖系统&#xff0c;并涵盖关键技术和实际代码。 1. 技术选型 1.1 后端开发 选择Node.js和Express框架进行后端开发&#xff0c;搭建一个灵…

Java框架基础--maven,http,postman

maven Maven 提供了一个标准的构建生命周期和一组约定的目录结构&#xff0c;以简化和规范项目的构建过程。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。提高了项目的可维护性、可重复性和一致性&#xff0c;简化了构建和依赖管理的复杂性&#xff0c;使得开…

docker-compose部署openldap

前段时间在本地搭建了一套gitlab geo测试环境&#xff0c;因为需要集成ldap&#xff0c;所以特意搭建下&#xff0c;特此作为笔记记录下。 文章目录 1. 前置条件2. 编写docker-openldap.yml文件3. 登录4. 使用创建组创建用户登录测试 1. 前置条件 安装docker-compose 安装docke…

python 用hyperlpr3 进行车牌识别

开源项目 https://github.com/zeusees/HyperLPR 下面按装相关的模块 pip install opencv-python pip install hyperlpr3 pip install cvlib代码 download_image_from_url 将网上图片存本地。 import urllib.request import cv2 import hyperlpr3 as lpr3 import matplotlib.…

Gateway集成方法以及拦截器和过滤器的使用

前提&#xff1a;请先创建好一个SpringBoot项目 1. 引入依赖 SpringCloud 和 alibabaCloud 、 SpringBoot间对版本有强制要求&#xff0c;我使用的springboot是3.0.2的版本。版本对应关系请看&#xff1a;版本说明 alibaba/spring-cloud-alibaba Wiki GitHub <dependency…

windows安装npm教程

NPM&#xff08;Node Package Manager&#xff09;是一个用于管理和共享JavaScript代码包的工具。它是Node.js生态系统的一部分&#xff0c;广泛用于构建JavaScript应用程序和库。 以下是NPM的主要功能和用途&#xff1a; 1.代码包管理 NPM允许开发者在项目中安装、更新、卸载…

Bellman_Ford算法总结

知识概览 Bellman_Ford算法适合解决存在负权边的最短路问题&#xff0c;时间复杂度为O(nm)。在存在负权边的最短路问题中&#xff0c;Bellman_Ford算法的效率虽然不如SPFA算法&#xff0c;但是Bellman_Ford算法能解决SPFA算法不能解决的经过不超过k条边的最短路问题。 例题展示…

Java对象内存布局和对象头

Java对象内存布局和对象头 在 HotSpot 虚拟机中&#xff0c;对象在内存中的布局分为三块区域&#xff1a;对象头&#xff0c;实例数据和对齐填充。 对象头中包含两部分&#xff1a;MarkWord 和 类型指针。如果是数组对象的话&#xff0c;对象头还有一部分是存储数组的长度。 …

什么是OAuth2.0

前言 OAuth&#xff08;Open Authorization&#xff09;是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三方移动应用或分享他们数…

【python】Ubuntu下安装spyder及matplotlib中文显示

一、查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy尝试用cat /etc/debian_version命令&#xff0c;竟然可以显示出来Debian的版本。 $ cat /etc/debian_version …

北斗三号海上人员落水报警及示位搜救系统

海洋水上作业中&#xff0c;人员落水问题时有发生&#xff0c;过去救援人员很难获取落水人员呼救信息、确定落水人员位置、事故发生时间以及事态严重程度&#xff0c;以给予最及时的救援&#xff0c;管理人员都对此无计可施&#xff0c;缺乏有效技术手段是目前海上事故救援效率…

如何使用JuiceSSH实现手机端远程连接Linux服务器

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

2023年小型计算机视觉总结

在过去的十年中&#xff0c;出现了许多涉及计算机视觉(CV)的项目&#xff0c;无论是小型的概念验证项目还是更大规模的生产应用。应用计算机视觉的方法是相当标准化的: 1、定义问题(分类、检测、跟踪、分割)、输入数据(图片的大小和类型、视野)和类别(正是我们想要的) 2、注释…

WEB 3D技术 three.js 通过分组顶点 给同一个物体设置多个材质

上文 WEB 3D技术 three.js 集合体 讲解三角形构建图形 顶点概念 顶点值重用 我们讲到 一个元素是由多个面组成的 那么 我们是不是可以一个物体用多个材质&#xff1f; 简单说 一个面用一种材质 我们还是在官网中搜索 geome 如下图选择 然后 找到 groups 顶点组 它能够将我们的…