C语言字符串查找函数和错误信息报告函数(strstr、strtok,strerror)

文章目录

  • 摘要
  • 1 strstr
    • 1.1 函数使用
    • 1.2 模拟实现
  • 2. strtok
    • 2.1 函数介绍
  • 3. strerror
    • 3.1 函数介绍
    • 3.2 strerror 与 perror

摘要

本篇文章介绍了C语言中常用的字符串处理函数,包括字符串查找函数 strstr 和字符串分割函数 strtok,以及错误信息报告函数 strerror。本章将详细说明每个函数的用法、参数和返回值,以及演示了如何使用它们。

1 strstr

1.1 函数使用

函数原型:

const char* strstr ( const char* str1, const char* str2 );
  • str1:要在其中查找的字符串。
  • str2:要查找的目标字符串。

strstr 是C语言中一个用于字符串处理的函数,该函数用于在一个字符串中查找另一个字符串的第一次出现位置。strstr 函数在 str1 字符串中搜索 str2 字符串,并返回第一次找到 str2 的位置(指向 str1 中的字符指针)。如果没找到 str2,则返回 NULL。
以下代码,展示了如何使用 strstr 函数来查找字符串:

#include <stdio.h>
#include <string.h>int main() 
{const char* str1 = "abcdef";const char* str2 = "def";const char* res = strstr(str1, str2);if (res != NULL) {printf("%s\n", res);} else {printf("在 %s 中未找到 %s\n", str1, str2);}return 0;
}

在上面代码中,strstr 函数查找字符串 “def” 在 “abcdef” 中的位置,并输出找到的位置。如果未找到,则输出未找到的消息。

1.2 模拟实现

实现思路:

  • 使用一个循环遍历 str1 字符串,直到遍历到字符串的 \0 位置。
  • 在每次循环中,比较 s1 和 s2 指向的字符,如果它们相等,则继续比较下一个字符。
  • 如果 s2 指针成功地遍历完 str2 字符串(*s2 == ‘\0’),表示找到了匹配的子字符串,返回 sp 指针,即匹配开始的位置。
  • 如果没有找到匹配,将 sp 指针向前移动一个位置,继续下一轮的比较。
  • 如果遍历完整个 str1 字符串都没有找到匹配,返回 NULL 表示未找到。
#include <stdio.h>
#include <assert.h>const char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = str1;//使用s1遍历str1const char* sp = str1;//记录str1中每次开始匹配的位置const char* s2 = str2;使用s2遍历str2//使用一个循环遍历 str1 字符串,直到遍历到字符串的 \0 位置while (*s1){//比较 s1 和 s2 指向的字符,如果它们相等,则继续比较下一个字符while (*s1 && *s1 == *s2){s1++;s2++;}//s2 指针成功地遍历完 str2 字符串,表示找到了匹配的子字符串,返回 sp 指针if (*s2 == '\0'){return sp;}//匹配失败,将 sp 指针向前移动一个位置,继续下一轮的比较sp++;s1 = sp;s2 = str2;}return NULL;
}
int main()
{const char* str1 = "abc";const char* str2 = "abcdef";const char* res = my_strstr(str1, str2);if (res != NULL){printf("%s\n", res);}else {printf("在 %s 中未找到 %s\n", str1, str2);}return 0;
}

2. strtok

2.1 函数介绍

函数原型:

char* strtok ( char* str, const char* delimiters );
  • str:要分割的字符串,首次调用时传入要分割的字符串,后续调用传入 NULL。
  • delimiters :分隔符字符集合,表示在哪些字符处分割字符串。

strtok 是C语言中一个用于字符串处理的函数,该函数根据指定的分隔符字符将字符串分割成多个子字符串。
strtok工作方式:

  • 第一次调用时,传入要分割的字符串 str 和分隔符字符集合 delimiters 。
  • 函数会在 str 中查找分隔符字符集合中的任何字符,并将第一个子字符串的起始地址返回。
  • 函数会将找到的分隔符字符替换为 \0,从而将原字符串分割成两部分。
  • 后续调用 strtok 时,给第一个参数传NULL时,函数会继续从上一次分割位置的下一个字符开始查找,并返回下一个子字符串的起始地址。
  • 当没有更多子字符串可以分割时,函数返回 NULL,表示结束。

需要注意的是:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。

以下两种方法,分别展示了如何使用 strtok 函数将一个字符串分割成多个子字符串:

  1. 使用for循环
#include <stdio.h>
#include <string.h>int main() {char str[] = "702144246@qq.com";const char set[] = "@.";// 第一次调用后续调用传str,后续调用传入 NULLfor (char* _str = strtok(str, set); _str != NULL; _str = strtok(NULL, set)){printf("子字符串:%s\n", _str);}return 0;
}
  1. 使用while循环
int main() {char str[] = "702144246@qq.com";//待切割字符串const char set[] = "@."; //切割字符集合char* _str = strtok(str, s); // 第一次调用while (_str != NULL) {printf("子字符串:%s\n", _str);_str = strtok(NULL, s); // 后续调用,传入 NULL}return 0;
}

在上面代码中,strtok 函数被用来根据 . 和 @ 分割字符串 “702144246@qq.com”,并将每个子字符串打印出来。strtok 函数在每次调用时都会返回下一个子字符串的指针,直到没有更多子字符串可分割。
运行结果:
在这里插入图片描述

3. strerror

3.1 函数介绍

函数原型:

char* strerror ( int errnum );
  • errnum:表示错误码,通常是由系统调用或库函数返回的错误码。

strerror 是C语言中错误信息报告函数,该函数会根据 errnum 参数返回对应的错误信息字符串。

以下代码,展示了如何使用 strerror 函数来获取错误信息:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main() {FILE *file = fopen("data.txt", "r");if (file == NULL) {int errnum = errno; // 获取当前的错误码printf("错误码:%d\n错误信息:%s\n", errnum, strerror(errnum)); // 获取错误信息字符串}else {// 成功打开文件的操作fclose(file);}return 0;
}

在上面代码中,我们试图打开一个不存在的文件,因此 fopen 函数会返回 NULL,并且设置了错误码 errno。然后,我们使用 strerror 函数根据错误码获取相应的错误信息字符串,并打印出了错误消息。

3.2 strerror 与 perror

  • strerror是将错误码翻译成错误信息,并返回错误信息字符串的起始地址。
  • 而perror也与处理错误信息有关,该函数默认使用全局变量 errno 中的错误码来查找相应的错误信息,并打印出对应的错误描述
    函数原型:
void perror(const char *s);
  • 参数s:自定义的错误消息前缀。
    以下代码,展示了如何使用 perror 函数来打印错误消息:
#include <stdio.h>
#include <string.h>
#include <errno.h>int main() {FILE *file = fopen("data.txt", "r");if (file == NULL){perror("打开失败");//用户自定义错误信息前缀。}else{// 成功打开文件的操作fclose(file);}return 0;
}

在上面代码中,我们试图打开一个不存在的文件,因此 fopen 函数返回 NULL 并设置了错误码 errno,该函数默认使用errno 中的错误码来查找相应的错误信息。然后,我们使用 perror 函数打印错误消息,前缀为 “打开失败”,以便清晰地指示是由于文件打开失败引发的错误。
运行结果:
在这里插入图片描述
至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

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

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

相关文章

SpringBoot使用随机端口启动

1.获取可用端口工具类 import java.net.InetAddress; import java.net.Socket; import java.util.Random;public class ServerPortUtil {private static final int MAX_PORT 65535;private static final int MIN_PORT 8000;public static String getAvailablePort() {Random…

Linux知识点 -- 网络基础 -- 数据链路层

Linux知识点 – 网络基础 – 数据链路层 文章目录 Linux知识点 -- 网络基础 -- 数据链路层一、数据链路层1.以太网2.以太网帧格式3.重谈局域网原理4.MAC地址5.MTU6.查看硬件地址和MTU的命令7.ARP协议 二、其他重要协议或技术1.DNS&#xff08;Domain Name System&#xff09;2.…

gunicorn

gunicorn 是一个 Python WSGI HTTP 服务器 可以用于运行 Python 网站或 Web 应用程序。 WSGI&#xff08;Web Server Gateway Interface&#xff09;定义了一种标准的接口&#xff0c; 将 Web 服务器和 Python 应用程序分离开来&#xff0c;使得 Web 服务器可以与不同的 Pytho…

[Machine learning][Part4] 线性回归模型技巧

目录 正规方程法 梯度下降法 缩放特征 学习率选择 正规方程法 这种方法可以不多次迭代梯度下降函数就能得到w,b。但是缺点是在大量数据训练情况下效率较低&#xff0c;其次是这种算法仅仅在线性回归中实现了&#xff0c;并没有在其他模型中实现&#xff0c;因此&#xff0c…

小程序A跳转小程序B并且自动登录

需求 例如有一个小程序A&#xff0c;A中有一个功能需要跳转小程序B进行查看。需要点击此功能跳转至小程序B,并且自动登录 实现方式 小程序A的跳转方法 wx.navigateToMiniProgram({appId: "目标小程序APPID",path: "目标小程序小程序页面",extraData: {use…

三相空气开关

一、三相空开的作用 三相空气开关对任意一相出现过载或短路&#xff0c;均起到保护作用。 二、三相空气开关原理图&#xff1a; 1、老式空气开关 1)、短路时&#xff0c;电磁脱钩器工作 2)、过载时&#xff0c;发热元件引起双金属片弯曲&#xff0c;使脱钩器工作 3)、测试按…

记一次SpringBoot中Service层未注入排查

同事自己在自己的电脑上写了一些小东西&#xff0c;遇到了请求时API层注入的Service为空问题。整体代码接口伪代码如下&#xff1a; public Interface ParentService{public String hello(String msg); } public abstract class ChildrenOneService implements ParentService…

RabbitMQ开启消息跟踪日志(trace)

Trace 是Rabbitmq用于记录每一次发送的消息&#xff0c;方便使用Rabbitmq的开发者调试、排错。 1、启动Tracing插件 在RabbitMQ中默认是关闭的&#xff0c;需手动开启。此处rabbitMQ是使用docker部署的 ## 进入rabbitMq中 docker exec -it rabbitmq1 bash ## 启动日志插件 r…

别再使用循环的方式筛选元素了!开发常用的Stream流+Lambda表达式过滤元素了解过吗?10000字超详细解析

目录 1. Stream 流的简单展示 1.1 抛出问题 1.2 传统解决问题的编码方式 1.3 Stream 流的方式过滤元素 2. Stream 流的核心思想 3. Stream 流的使用 3.1 获取 stream 流 3.1.1 单列集合获取 stream 流 3.1.2 双列集合获取 stream 流 3.1.3 数组获取 stream 流 3.1.4…

低功耗蓝牙(BLE)开发——Qt

背景知识 低功耗蓝牙比经典蓝牙复杂些&#xff0c;需要了解一些协议的基础知识。 此部分参考博客GATT Profile 简介-CSDN博客 GATT详细介绍-CSDN博客 Introduction | Introduction to Bluetooth Low Energy | Adafruit Learning System 蓝牙 (四) GATT profile-CSDN博客 关…

Centos中利用自带的定时器Crontab_实现mysql数据库自动备份_linux中mysql自动备份脚本---Linux运维工作笔记056

这个经常需要,怕出问题因而需要经常备份数据库,可以利用centos自带的定时器,配合脚本实现自动备份. 1.首先查看一下,这个crontab服务有没有打开: 执行:ntsysv 可以看到已经开机自启动了. 注意这个操作界面,用鼠标不行,需要用,tab按键,直接tab到确定,或取消,然后按回车回到命…

CSS 之 table 表格布局

一、简介 ​ 除了使用HTML的<table>元素外&#xff0c;我们还可以通过display: table/inline-table; 设置元素内部的布局类型为表格布局。并结合table-cell、table-row等相关CSS属性值可以实现HTML中<table>系列元素的效果&#xff0c;具有表头、表尾、行、单元格…

Docker-compos

Docker-compose 简介 Docker-Compose项目是基于Python开发的Docker官方开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是 工程&#xff08;project&#xff09;&#xff0c;服务&#xff08;service&#…

Java基础面试-重载和重写的区别

重载:发生在同一个类中&#xff0c;方法名必须相同&#xff0c;参数类型不同、个数不同、顺序不同&#xff0c;方法返回值和访问修饰符可 以不同&#xff0c;发生在编译时。 重写:发生在父子类中&#xff0c;方法名、参数列表必须相同&#xff0c;返回值范围小于等于父类&…

HSRP热备份路由器协议的解析和配置

HSRP的解析 个人简介 HSRP hot standby router protocol 热备份路由协议&#xff08;思科私有协议&#xff09; HSRP v1 version 1 HSRP v2 version 2 虚拟一个HSRP虚拟IP地址 192.168.1.1 开启HSRP的抢占功能 通过其他参数 人为调整谁是主 谁是从 &#xff01; 查…

记录一次线上fullgc问题排查过程

某天&#xff0c;接到测试部门反馈说线上项目突然很快&#xff0c;由于当前版本代码和上一版本相比就多了一个刚上线了一个5分钟1次的跑批任务&#xff0c;先关闭次任务后观察是否卡顿&#xff0c;并检查堆内存是否使用完造成频繁gc 1.通过jmap命令查看堆内存中的对象 2.生成当…

许战海战略文库|无增长则衰亡:中小型制造企业增长困境

竞争环境不是匀速变化&#xff0c;而是加速变化。企业的衰退与进化、兴衰更迭在不断发生&#xff0c;这成为一种不可避免的现实。事实上&#xff0c;在产业链竞争中增长困境不分企业大小&#xff0c;而是一种普遍存在的问题&#xff0c;许多收入在1亿至10亿美元间的制造企业也同…

【Redis】Redis中的Big Key问题:排查与解决思路

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 Big Key问题介绍Big Key问题排查BIGKEYS命令Debug Objectmemory usage redis-rdb-tools Big Key问题解决思路分割大key对象压缩直接删除 在处理大型数据时&#xff0c;Redis 作为我们的非关系型数据库经常出…

PlantUML 绘图

官网 https://plantuml.com/zh/ 示例 绘制时序图 USB 枚举过程 PlantUML 源码 startuml host <-- device : device insert host note right : step 1 host -> device : get speed, reset, speed check note right : step 2 host -> device …

LONGLORA: EFFICIENT FINE-TUNING OF LONGCONTEXT LARGE LANGUAGE MODELS

本文是LLM系列文章&#xff0c;针对《LONGLORA: EFFICIENT FINE-TUNING OF LONGCONTEXT LARGE LANGUAGE MODELS》的翻译。 Longlora:长上下文大型语言模型的高效微调 摘要1 引言2 相关工作3 LongLoRA4 实验5 结论 摘要 我们提出了LongLoRA&#xff0c;一种有效的微调方法&…