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,一经查实,立即删除!

相关文章

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

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

三相空气开关

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

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&#…

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亿美元间的制造企业也同…

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 …

Premiere Elements 2024(PR简化版)直装版

Adobe Premiere Elements 2024 是一款由Adobe Systems推出的视频编辑软件&#xff0c;它结合了易用性和专业级的功能&#xff0c;帮助用户对视频进行剪辑、特效、色彩校正等处理。 主要功能和特点&#xff1a; 导入和组织视频&#xff1a;Premiere Elements 2024允许用户快速导…

ESP8266 WiFi物联网智能插座—下位机软件实现

目录 1、软件架构 2、开发环境 3、软件功能 4、程序设计 4.1、初始化 4.2、主循环状态机 4.3、初始化模式 4.4、配置模式 4.5、运行模式 4.6、重启模式 4.7、升级模式 5、程序功能特点 5.1、日志管理 5.2、数据缓存队列 本篇博文开始讲解下位机插座节点的MCU软件…

虚拟机软件Parallels Desktop 19 mac功能介绍

Parallels Desktop 19 mac是一款虚拟机软件&#xff0c;它允许用户在Mac电脑上同时运行Windows、Linux和其他操作系统。Parallels Desktop提供了直观易用的界面&#xff0c;使用户可以轻松创建、配置和管理虚拟机。 PD19虚拟机软件具有快速启动和关闭虚拟机的能力&#xff0c;让…

Kelper.js 笔记 python交互

1 加载Kepler 地图 KeplerGl() 1.1 主要参数 height 可选 默认值&#xff1a;400 地图显示的高度 data 数据集 字典&#xff0c;键是数据集的名称 config地图配置字典 1.2 举例 from keplergl import KeplerGlmap_KeplerGl() map_ 默认的位置 1.3 添加自己的图 1.3.1 读…

ElementPlus Switch 开关基础使用

昨天开发用到开关组件 后台返回字段是 can_write 默认是0 or 1 但是Switch 组件绑定的默认值默认是 true or false 直接绑定会导致默认是关闭状态 在页面一加载 值发生变化时 会自己调用 查了文档 需要使用 active-value 和 inactive-value 来指定绑定的数据类型 …

23种经典设计模式:单例模式篇(C++)

前言&#xff1a; 博主将从此篇单例模式开始逐一分享23种经典设计模式&#xff0c;并结合C为大家展示实际应用。内容将持续更新&#xff0c;希望大家持续关注与支持。 什么是单例模式&#xff1f; 单例模式是设计模式的一种&#xff08;属于创建型模式 (Creational Pa…

网页游戏的开发流程

网页游戏的开发流程可以根据项目的规模和复杂性而有所不同&#xff0c;但通常包括以下一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析&#xff1a; 确定游戏的概念、目标受众和核…

手写 分页

子组件&#xff1a;TimePage.vue 效果图 <template><div class"click-scroll-X"><!-- 上 --><!-- eslint-disable-next-line --><span class"left_btn" :disabled"pageNo 1" click"leftSlide"><&…